看到一篇討論,
http://bbs.csdn.net/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語言類型提升啊。