繁体   English   中英

将uint8_t转换为int8_t

[英]Casting uint8_t to 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 因此,您应该检查编译器文档,在这些情况下平台将执行什么操作,并且如果可以的话,最好避免使用它。

从评论中确定

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;

解决了问题。 感谢大伙们!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM