GCC 4.8.0 biên dịch trong/cho 32 bit.Hành vi truyền có thể không nhất quán
tôi thấy hành vi của các trường hợp và để gây nhầm lẫn:
int16_t s16 = 0;
double dbl = 0.0;
s16 = (int16_t)((double)32767.0); // 1: s16 = 32767
s16 = (int16_t)((double)32768.0); // 2: s16 = 32767
s16 = (int16_t)((double)-32768.0); // 3: s16 = -32768
s16 = (int16_t)((double)-32769.0); // 4: s16 = -32768
dbl = 32767.0;
s16 = (int16_t)dbl; // 5: s16 = 32767
dbl = 32768.0;
s16 = (int16_t)dbl; // 6: s16 = -32768
dbl = -32768.0;
s16 = (int16_t)dbl; // 7: s16 = -32768
dbl = -32769.0;
s16 = (int16_t)dbl; // 8: s16 = -32768
Tôi nhận ra đó là thực hiện được xác định, nhưng quán vẫn sẽ được tốt đẹp. Bất cứ ai có thể giải thích những gì đang xảy ra?
Không cần phải bỏ '32767.0',' 32768.0', '-32768.0' thành' double', chúng đã thuộc loại 'double'. – ouah
@ouah Vâng, tôi biết. Tôi đã làm như vậy để nhấn mạnh hành vi. – Ioan