int_8 int8 = ~0;
uint_16 uInt16 = (uint_16) int8;
关于上面的类型转换;在C标准中哪里可以找到对以下行为的指示? - 在无符号解释(uInt16 = 0xFFFF)之前对较大类型的符号扩展,而不是无符号解释,然后对较大类型(uInt16 = 0xFF)进行0扩展。
来自C99 6.3.1.8
否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则带有符号整数类型的操作数将转换为具有无符号整数的操作数的类型类型。
上面的陈述清楚地表明需要转换哪个变量,但是对于如何实际执行对话并不是很清楚,因此我的问题要求从标准中引用。 谢谢
答案 0 :(得分:2)
根据standard:
6.3.1.3有符号和无符号整数
......
2.否则,如果新类型是无符号的,则通过重复加或减一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内。
脚注以避免在解释上述内容时产生混淆:
规则描述了数学值的算术,而不是给定类型表达式的值。
即。如果您的int8
的值为-1
(假设否定表示是2&#39的补码,则在您的示例中确实如此),当转换为uint16_t
时,值{{1将添加到它(比(0xFFFF + 1)
可以表示的最大值多一个),这会产生uint16_t
的结果。
答案 1 :(得分:0)
我认为答案实际上也是6.3.1.8的一部分:
否则,将对两个操作数执行整数提升。 然后以下规则适用于提升的操作数: .... 否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的等级.....
意味着在使用规则6.3.1.3转换为无符号之前首先执行整数提升。