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

Rak*_*mar 1 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");    
Run Code Online (Sandbox Code Playgroud)

在gcc编译器中运行后,这段代码返回BDEH ....我无法理解为什么它就像那样.请有人指导这个.

Jen*_*edt 6

这被标准称为" 通常的算术转换 ",并且只要两个不同的整数类型作为同一运算符的操作数出现就适用.

实质上是做什么的

  • 如果类型具有不同的宽度(更准确地说是标准调用转换排名),那么它将转换为更宽的类型
  • 如果两种类型的宽度相同,除了非常奇怪的架构之外,它们的未签名也会获胜

-1任何类型的值进行无符号转换都会导致无符号类型的最高可表示值.

对于第(1)行,结果取决于宽度longint范围.如果int比较窄long,则所有unsigned值都适合long,因此longRHS 的转换停止.然后结果是"A".如果它们具有相同的宽度,则unsigned long双方的转换继续进行,结果为"B".

对于您的特殊情况下short也有一个被称为"功能整型的提升 ",促进了比窄所有类型intint.在第3行和第4行中,您必须先将LHS上的表达式转换为int保持值不变的值,然后将(3)转换unsigned int为(4)转换为unsigned long.

根据我的平台(linux,gcc)正确打印"ADFH"与您的代码.

结果"BDEH"将发生的第一有一个平台上long,并int具有相同的宽度,并且具有的范围unsigned通过的范围所覆盖int,也就是说,其为unsigned仅忽略的符号位int.我不知道这样的平台仍然存在.

几年来,我写了一篇关于整数类型解剖的博客文章,这应该仍然有效.