如何使用unsigned short int -1L进行比较

时间:2013-10-17 06:33:00

标签: c

(-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 个答案:

答案 0 :(得分:6)

标准称之为“通常的算术转换”,只要两个不同的整数类型作为同一运算符的操作数出现,就适用。

本质上是做什么

  • 如果类型有不同的宽度(更准确地说是标准 调用转换排名)然后它转换为更宽的类型
  • 如果两种类型的宽度相同,除了非常奇怪的架构, 他们的未签名胜利

对任何类型的值-1的无符号转换进行签名,总是会产生无符号类型的最高可表示值。

对于第(1)行,结果取决于longint的宽度。如果intlong更窄,则所有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”会出现在首先具有相同宽度的longint并且范围unsigned涵盖范围int的平台上},unsigned只是忽略了int的符号位。我不知道这些平台仍然存在。

有些年头我在the anatomy of integer types上写了一篇博文,该博文应该仍然有效。