将uint8_t转换为int8_t

时间:2015-11-25 13:38:46

标签: c microchip xc8

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

2 个答案:

答案 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;

解决了这个问题。谢谢你们!