(-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 ....我无法理解为什么会这样。请有人指导。
答案 0 :(得分:6)
标准称之为“通常的算术转换”,只要两个不同的整数类型作为同一运算符的操作数出现,就适用。
本质上是做什么
对任何类型的值-1
的无符号转换进行签名,总是会产生无符号类型的最高可表示值。
对于第(1)行,结果取决于long
和int
的宽度。如果int
比long
更窄,则所有unsigned
值都适合long
,因此转换将在long
处停止为RHS。然后结果是“A”。如果它们具有相同的宽度,则双方的转换继续为unsigned long
,结果为“B”。
对于short
的特殊情况,还有一个名为“整数促销”的功能,可以宣传所有类型都比int
更窄到int
。在第3行和第4行中,您必须首先将LHS上的表达式转换为int
,保持值不变,然后将(3)转换为unsigned int
,将(4)转换为unsigned long
。
根据我的平台(linux,gcc)正确地用你的代码打印“ADFH”。
结果“BDEH”会出现在首先具有相同宽度的long
和int
并且范围unsigned
涵盖范围int
的平台上},unsigned
只是忽略了int
的符号位。我不知道这些平台仍然存在。
有些年头我在the anatomy of integer types上写了一篇博文,该博文应该仍然有效。