类型提升规则:
1、首先,如果一个操作书的类型是long double,那么另一个操作数也被转化为long double。其次,如果一个操作数的类型是double,那么另一个操作数也被转换为double。再次,如果其中一个操作数的类型是float,那么 另一个操作数也被转换为float。否则,两个操作数进行整型提升,执行下面的规则:
2、如果其中一个操作数是unsigned long int,那么另一个操作数也被转换为unsigned long int。其次,如果其中一个操作数是long int, 而另一个操作数的类型是unsigned int ,如果long int 能够完整表示unsigned int 的所有值,那么unsigned int类型操作数被转换为long int,如果long int类型不能完整的表示unsigned int 的所有值,那么两个操作数都被转换为unsigned long int。再次,如果其中一个操作数的类型是long int,那么另一个操作数转换为long int。再再次,如果其中一个操作数的类型是unsigned int ,那么另一个操作数被转换为unsigned int。如果所有以上的情况都不属于,那么两个操作数都为int。
(注意:unsigned long int可能是32bits,也可能是64bits。)
int array[]={1, 2, 3};
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
int main()
{
int d = -1;
int x = 0;
short i = 1;
if(d<=TOTAL_ELEMENTS)//signed int与unsigned int比较:类型提升
x = 1;
printf("%d\n", x);
printf("%d\n", sizeof‘a‘);//类型提升已经“褪色”
printf("%d %d\n", sizeof(‘a‘-‘0‘), sizeof(i * i));//类型提升char->int;short->int;
return 0;
}
另一个例子:
int main() { unsigned short a = 6; short b = -20; int c = a + b; //a---->(int) //b---->(int) unsigned short d = a + b; //a---->(int) //b---->(int) //(int)----->(unsigned short) int e = d; //(unsigned short)---->(int) printf("%d, %d\n", sizeof(short), sizeof(int));//2,4 printf("%d, %d\n", c, e);//-14, 65522 return 0; }
原文:http://www.cnblogs.com/LFMY/p/3627655.html