1

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

4

2 回答 2

1

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

如果int更大,则表达式的一切都很好,您只需将适合的正值相加int。但是由于初始化,结果值将被转换回int16_t,这导致“实现定义”转换或信号的提高。所以你应该检查你的编译器文档,你的平台在这些情况下做了什么,如果可以的话,最好避免它。

于 2015-11-25T13:47:32.393 回答
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;

解决问题。感谢你们!

于 2015-11-25T14:25:30.957 回答