C语言整型提升(隐式类型转换)
??
定义
??C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升 (integral promotion)。
这一规则是由C语言的发明人丹尼斯·里奇与肯·汤普逊创设的 (原话如下)
“A character, a short integer, or an integer bit-field, all either signed or not, or an object of enumeration type, may be used in an expression wherever an integer maybe used. If an int can represent all the values of the original type, then the value is converted to int; otherwise the value is converted to unsigned int. This process is called integral promotion.”
翻译:“ 表达式中可以使用整数的地方,就可以使用枚举类型,或有符号或无符号的字符、短整数、整数位域。 如果一个 int 可以表示原始类型的所有值,则将该值转换为 int; 否则该值将转换为无符号整数。 这个过程叫做整型提升。”
??
整型提升的意义
?? 在于:表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。 ??因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。 ??通用CPU 是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。 ????? (来源于百度百科)
char a,b,c;
a = b + c;
b, c的值被提升为普通整型进行加法运算。但是运算结果会被截断再存储到a中。
unsigned char a = 0;
unsigned char b = 255;
unsigned char c = 255;
a = b + c;
printf("%u\n", a);
截断
??
整型提升
整型提升是按照变量的数据类型 (变量本身的数据类型) 的符号位进行提升。
//正数整型提升 char a = 1; a在内存中为(二进制补码):0000 0001 因为 char 有符号符号位为0,所以整型提升由8个bit到32个bit: 0000 0000 0000 0000 0000 0000 0000 0001 ?? //负数整型提升 char a = -1; a在内存中为(二进制补码):111 1111 因为 char 有符号符号位为1,所以整型提升由8个bit到32个bit: 1111 1111 1111 1111 1111 1111 1111 1111
例题:
int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if (a == 0xb6)
printf("a\n");
if (b == 0xb600)
printf("b\n");
if (c == 0xb6000000)
printf("c\n");
return 0;
}
0xb6的二进制补码为 1011 0110 因为char 是有符号,等于运算整型提升补1,结果不等于0xb6,为假。
??
int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(!c));
return 0;
}
c只要参与表达式运算,就会发生整形提升,表达式 +c ,就会发生提升,所以 sizeof(+c) 是4个字节;但(!c)是否整型提升跟编译器有关,有待研究。
V S 2013运行截图 Dev C++运行截图
|