??C的整型算术运算总是至少以缺省整型类型的精度来进行的。
??为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。
??表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
??因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长度。
??通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。
??整形提升是按照变量的数据类型的符号位来提升的,负数整形提升的时候,高位补充符号位,即为1。正数整形提升的时候,高位补充符号位,即为0。无符号整形提升,高位补0。
??char 到底是signed char还是unsigned char是不确定的,C语言标准没有明确指定,是取决于编译器的。在当前使用的VS上,char == signed char
#include<stdio.h>
int main()
{
char a = 5;
//00000000000000000000000000000101
//00000101
char b = 126;
//00000000000000000000000001111110
//01111110
char c = a + b;
//00000000000000000000000000000101-a
//00000000000000000000000001111110-b
//00000000000000000000000010000011
//10000011-c
//11111111111111111111111110000011
//10000000000000000000000001111100
//10000000000000000000000001111101
//-125
printf("%d\n", c);
return 0;
}
代码运行成功,结果如下:
#include<stdio.h>
int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if (a == 0xb6)
printf("a");
if (b == 0xb600)
printf("b");
if (c == 0xb6000000)
printf("c");
return 0;
}
代码运行成功,结果如下:
??代码中的a,b要进行整形提升,但是c不需要整形提升。
??a,b整形提升之后,变成了负数,所以表达式 a0xb6 , b0xb600 的结果是假,但是c不发生整形提升,则表达式 c==0xb6000000 的结果是真。
还有一段代码可以直观的感受到整形提升,代码如下:
#include<stdio.h>
int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
return 0;
}
运行代码成功,结果如下:
由此可见,c只要参与表达式运算,就会发生整形提升。
本篇博客为本人学习C语言时的详细笔记,如有错误之处,还望各位指正。
文章为原创,如要转载请注明出处