整形类规:
否则,两个操作数都不是三种浮点类型之一,它们一定是某种整值类型。在确定共同的目标提升类型之前,编译器将在所有小于int的整值类型上施加一个被称为整值提升(integral promotion)的过程。在进行整值提升时,类型(char、signed char、unsigned char和short、int)都被提升为类型int。如果机器上的int型足够表示所有unsigned、shoft型的值(这通常发生在short用半个字表示,而int用一个字表示的情况下),则unsigned short int也被转换成int,否则它会被提升为unsigned int。
wchar_t和枚举类型被提升为能够表示其底层类型(underlying type)所有值的最小整数类型。
一旦整值提升执行完毕,类型比较就又一次开始。如果一个操作数是unsigned long型,则第二个也被转换成unsigned long型。如果两个操作数的类型都不是unsigned long,而其中一个操作数是long型,则另一个也被转换成long型。long 类型的一般转换有一个例外,如果一个操作数是long型,而另一个是unsigned int型,那么只有机器上的long型足够长,以便能够存放unsigned int的所有值时(一般来说,在32位操作系统中,long型和int 型都用一个字长来表示,所以不满足这里的假设条件),unsigned int才会被转换为long型,否则两个操作数都被提升为unsigned long型。若两个操作数都不是long型,而其中一个是unsigned int型,则另一个也被转换成unsigned int 型。否则两个操作数一定都是int 型。
int d = -1;
if (d <= sizeof(arr)/sizeof(arr[0]))
...
这样的比较语句有问题,sizeof运算符返回无符号数。
责任编辑:小草