看到一篇讨论,
http://bbs.youkuaiyun.com/topics/370074973
感觉不错。自己总结一下:
第一:有符号,无符号提升顺序为,char,unsigned char, short ,unsigned short, int, unsigned int, long, unsigned long,,long long, unsigned long long....。这样的提升顺序不会丢失数据。这点灰常重要。
比如:
#include<stdio.h>
int main(void)
{
unsigned char a=1;
if(a<-1)
{
printf("1<-1\n");
}
}
由于 a 是 unsigned char 的, -1 是 signed int 的,所以 a被提升为 siigned int, 为+1, printf( "1<-1\n")就不会执行了。
如果把 a 改为 unsigned int, 那么 -1 将提升为 unsigned int, 变为0xFFFFFFFF, 这样还是-1大,那么, printf( "1<-1\n")就输出了。
对于下面代码:
1 #include <stdio.h>
2 int main()
3 {
4 int a = -1;
5 if( a < 0x8FFFFFFF ){
6 printf( "1 < -1\n" );
7 }
8 }
printf()不输出的,我想是因为0x8FFFFFFF超出了signed int 的范围,所以 a被提升为 unsigned int, 这样-1就成老大哥了。
再来看一个:
1 #include <stdio.h>
2 int main()
3 {
4 int a = -1;
5 if( a < 0x0FFFFFFF ){
6 printf( "1 < -1\n" );
7 }
8 }
printf()会输出的,因为0x0FFFFFFF没有超过signed int的范围,所以上面两个是 signed int 的比较。
很有意思的C语言类型提升啊。