(-1L<1U) ? printf("A"):printf("B");
(-1L<1UL) ? printf("C"):printf("D");
((short int)-1<1U) ? printf("E"):printf("F");
((short int)-1<1UL) ? printf("G"):printf("H");
这段代码在 gcc 编译器中运行后返回 BDEH ....我无法理解为什么会这样。请有人指导。
(-1L<1U) ? printf("A"):printf("B");
(-1L<1UL) ? printf("C"):printf("D");
((short int)-1<1U) ? printf("E"):printf("F");
((short int)-1<1UL) ? printf("G"):printf("H");
这段代码在 gcc 编译器中运行后返回 BDEH ....我无法理解为什么会这样。请有人指导。
这被标准称为“通常的算术转换”,当两个不同的整数类型作为同一运算符的操作数出现时适用。
本质上是做什么的
具有任何类型的值的有符号到无符号转换-1
始终会导致无符号类型的最高可表示值。
对于第 (1) 行,结果取决于宽度long
和int
范围。如果int
比 窄long
,则所有unsigned
值都适合long
,因此 RHS 的转换停止long
。结果是“A”。unsigned long
如果它们具有相同的宽度,则两边的转换继续进行,结果为“B”。
对于您的特殊情况,short
还有一个称为“整数提升”的功能,它提升所有比int
to更窄的类型int
。在您的第 3 行和第 4 行中,您将首先将 LHS 上的表达式转换为int
,这使值保持不变,然后将 (3) 转换为 (3)unsigned int
并将 (4) 转换为unsigned long
。
据此,我的平台(linux、gcc)使用您的代码正确打印“ADFH”。
结果“BDEH”将出现在首先具有long
和int
具有相同宽度并且范围为 的范围所unsigned
覆盖的平台上int
,即unsigned
忽略 的符号位int
。我不知道这样的平台仍然存在。
几年来,我写了一篇关于整数类型剖析的博文,它应该仍然有效。