请看我的测试代码:
#include <stdlib.h>
#include <stdio.h>
#define PRINT_COMPARE_RESULT(a, b) \
if (a > b) { \
printf( #a " > " #b "\n"); \
} \
else if (a < b) { \
printf( #a " < " #b "\n"); \
} \
else { \
printf( #a " = " #b "\n" ); \
}
int main()
{
signed int a = -1;
unsigned int b = 2;
signed short c = -1;
unsigned short d = 2;
PRINT_COMPARE_RESULT(a,b);
PRINT_COMPARE_RESULT(c,d);
return 0;
}结果如下:
a > b
c < d我的平台是Linux,我的gcc版本是4.4.2。我对第二行的产出感到惊讶。输出的第一行是由整数提升引起的。但是为什么第二行的结果不同呢?
以下规则来自C99标准:
如果两个操作数都具有相同的类型,则不需要进一步的转换。否则,如果两个操作数都具有有符号整数类型或都具有无符号整数类型,则具有较小整数转换秩类型的操作数将转换为级别较大的操作数类型。 否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数类型的秩,则带符号整数类型的操作数转换为无符号整数类型的操作数类型。 否则,如果带符号整数类型的操作数的类型可以用无符号整数类型表示操作数类型的所有值,则具有无符号整数类型的操作数转换为带符号整数类型的操作数类型。 否则,两个操作数都转换为与带符号整数类型的操作数类型对应的无符号整数类型。
我认为这两种比较应该属于同一种情况,即整数提升的第二种情况。
发布于 2011-10-10 23:27:31
摘自C++标准:
4.5积分促销conv.prom 1如果int可以表示源类型的所有值,则可以将char、符号char、无符号char、空int或无符号短int的r值转换为int类型的rvalue;否则,可以将源rvalue转换为无符号int类型的rvalue。
在实践中,这意味着所有操作(在列表中的类型上)实际上都是在类型int上计算的,如果它能够覆盖您所处理的整个值集,否则它将在unsigned int上执行。在第一种情况下,将值作为unsigned int进行比较,因为其中之一是unsigned int,这就是为什么-1“大于”2的原因。在第二种情况下,值a比较为有符号整数,因为int涵盖了short和unsigned short的整个区域,而so -1小于2。
(背景故事:实际上,以这种方式涵盖所有情况的所有复杂定义都导致编译器实际上可以忽略(!):后面的实际类型,而只关心数据大小。)
发布于 2016-08-10 00:09:52
C++的转换过程被描述为常用算术变换。然而,我认为最相关的规则是在子引用的部分conv.prom:整体促销4.6.1。
整数转换秩( char16_t )小于int的整数类型( bool、char16_t、char32_t或wchar_t )以外的整数类型的prvalue可以转换为int类型的prvalue,如果int可以表示源类型的所有值;否则,源prvalue可以转换为类型为无符号int的prvalue。
有趣的是使用"can“一词,我认为这表明这种推广是由编译器自行决定的。
我还发现了这 C-spec代码片段,它暗示没有进行升级:
11 EXAMPLE 2 In executing the fragment
char c1, c2;
/* ... */
c1 = c1 + c2;
the ``integer promotions'' require that the abstract machine promote the value of each variable to int size
and then add the two ints and truncate the sum. Provided the addition of two chars can be done without
overflow, or with overflow wrapping silently to produce the correct result, the actual execution need only
produce the same result, possibly omitting the promotions.还有需要考虑的“等级”的定义。规则的清单相当长,但由于它适用于这个问题,“排名”很简单:
任何无符号整数类型的秩应等于相应有符号整数类型的秩。
https://stackoverflow.com/questions/7711124
复制相似问题