使用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);
我希望测试为-13(oxFFF3),因为我使用了有符号数字,但计算结果为0xF3。
为什么?
编辑:尝试使用gcc,结果就是我的预期。
答案 0 :(得分:1)
正如Olaf正确评论的那样,如果int
的宽度为16,则移位操作可能没有定义的行为,因为您将位移到int16_t
的符号位。那么你的代码是错误的,你无法推断出你的平台可能实现的价值。
如果int
更大,表达式的所有内容都可以,您只需添加适合int
的正值。但是由于初始化,结果值将被转换回int16_t
,这导致定义了一个&#34;实现。转换或提升信号。所以你应该检查你的编译器文档在这些情况下你的平台做了什么,如果可以的话,最好避免使用它。
答案 1 :(得分:0)
从评论中确定
int16_t test;
uint8_t msb = 0xff;
uint8_t lsb = 0xf4;
uint8_t hyst = 0xff;
test = (int16_t)(((uint16_t)msb)<<8) + (uint16_t)lsb) + (int8_t)hyst;
解决了这个问题。谢谢你们!