(-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 ....我无法理解为什么它就像那样.请有人指导这个.
这被标准称为" 通常的算术转换 ",并且只要两个不同的整数类型作为同一运算符的操作数出现就适用.
实质上是做什么的
对-1任何类型的值进行无符号转换都会导致无符号类型的最高可表示值.
对于第(1)行,结果取决于宽度long和int范围.如果int比较窄long,则所有unsigned值都适合long,因此longRHS 的转换停止.然后结果是"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.我不知道这样的平台仍然存在.
几年来,我写了一篇关于整数类型解剖的博客文章,这应该仍然有效.