【发布时间】:2015-11-25 13:38:46
【问题描述】:
使用 Microchip XC8 我有一个构造
int16_t test;
uint8_t msb = 0xff;
uint8_t lsb = 0xf4;
uint8_t hyst = 0xff;
test = ((((int16_t)msb)<<8) + (int16_t)lsb) + (int8_t)hyst);
我希望 test 为 -13 (oxFFF3),因为我使用了带符号的数字,但它被计算为 0xF3。
为什么?
编辑:使用 gcc 进行了尝试,结果符合我的预期。
【问题讨论】:
-
标准整数转换和未定义行为。
-
如果
int由于左移而为 16 位,则这是未定义的行为。sizeof(int)是什么? -
然后是 UB。如果您将
((int16_t)msb)更改为((uint16_t)msb),您将摆脱未定义的行为,尽管它仍然是实现定义的。 -
转换为
int16_t是多余的,只会降低可读性,因为这些值无论如何都会被提升为 int。