表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度
一般就是int的字节长度,同时也是CPU的通用寄存器的长度
整型提升的意义:通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转换为int或unsigned int,然后才能送入CPU去执行运算。
因此,在c语言中,那些字节长度低于int类型的都要通过整型提升,再参加运算;
如char、short;
那么,它是怎么实现整型提升的呢?
首先,我拿char举例,我们知道char字符类型大小是1byte、8bit;
在两个字符相加时;会逐个整型提升;
char a = 20;
//00010100
char b = 100;
//01100100
正整数20的二进制源码为:00000000000000000000000000010100
但将一个4byte的int存储在一个1byte的char中,必然不能准确存放,
会截断原来8个bit的有效位存放在char中,
此时, a 中存放的就是截断后的20;也就是:00010100;
b 也一样,存储的是截断后的100; 也就是: 01100100;
char c = a + b;
在计算a+b时;将a 和 b整型提升;将它们转为4byte32位的int,再进行二进制的相关计算
此时整型提升;要将char中的8bit提升至32bit;
怎么补呢?
在补高位时,补的是char中的符号位,
拿a变量举例
也就是将:00010100 补充至:00000000000000000000000000010100
b也亦是如此:
01100100 至 00000000000000000000000001100100
再进行 a + b
a:00000000000000000000000000010100
b:00000000000000000000000001100100
a+b:00000000000000000000000001111000
此时,char c会将它截断,至存放8bit
也就是:01111000
完成后,若想查看c的值,再加一步;
printf("%d\n", c);
此时,还要再进行一次整型提升,因为
%d打印的是有符号的整型;
要将c中的:01111000;提升为:00000000000000000000000001111000
再打印
c中存储的值为120;