c-将uint8_t转换为int8_t



使用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,结果是我所期望的。

正如Olaf正确指出的,如果int的宽度为16,则移位操作可能没有定义的行为,因为您将一位移位到int16_t的符号位中。那么你的代码是错误的,你无法推断出你的平台可能实现的价值。

如果int较大,则表示表达式一切正常,只将适合int的正值相加。但是,由于初始化,结果值将被转换回int16_t,这将导致"实现定义"的转换或信号的提升。因此,您应该检查编译器文档,在这种情况下,您的平台会做什么,如果可以的话,最好避免它。

从评论中确定

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;

解决了问题。谢谢你们!

相关内容

  • 没有找到相关文章

最新更新