【发布时间】:2016-12-04 06:03:43
【问题描述】:
int_8 int8 = ~0;
uint_16 uInt16 = (uint_16) int8;
关于上面的类型转换;在 C 标准中,我可以在哪里找到对以下行为指示的参考? - 在无符号解释 (uInt16=0xFFFF) 之前对较大类型进行符号扩展,而不是在无符号解释之后对较大类型进行 0 扩展 (uInt16=0xFF)。
从 C99 6.3.1.8
否则,如果无符号整数类型的操作数的秩大于或等于另一个操作数类型的秩,则将有符号整数类型的操作数转换为无符号整数类型的操作数的类型输入。
上面的声明很清楚需要转换哪个变量,但是关于实际上应该如何执行对话并不是很清楚,因此我的问题是要求从标准中获得参考。 谢谢
【问题讨论】:
-
经验法则:
(uint_16)int8 + (uint_16)(-int8) == 0应该成立。 -
@lorro 不同意
(uint_16)int8 + (uint_16)(-int8) == 0。使用int_8,uint_16作为int8_t, uint16_t,在32 位int机器上,使用int8 > 0,结果始终为65536,类型为int。 -
@chux:是的,抱歉,忘记了最后的演员表。修复:
(uint16_t)( (uint16_t)int8 + (uint16_t)(-int8)) == 0。感谢您发现!
标签: c casting integer-promotion