整形提升原理及验证
发生场景:
隐式类型转换:C语言中,算术运算时至少会以缺省类型的精度进行。为了达到这个精度,表达式中的字符和短整形操作数在计算之前会被转换为普通整形,这种转换就是整形提升。
为什要进行整形提升?
表达式的整形运算在CPU中的相应运算器件内执行,而CPU的整形运算器(ALU)的操作字节长度一般为int的字节长度,这也是CPU通用寄存器的长度。
通用CPU难以实现两个小于int长度的n个字节直接相加运算,所以,表达式中各种长度可能小于int长度的整形值,都要先转换为int或者unsigned int ,再送入CPU进行运算。
例:
char a,b,c;
...
a = b+c;
其中b和c在进行运算时,会被提升为普通整形,加载到CPU中执行加法运算,运算完成后,运算结果会被截断,存储到a中。
如何进行整形提升
整形提升,依照变量数据类型的符号位来进行提升
1.无符号整形提升,高位补0
2.有符号的整形提升,高位补其符号位
- 负数的整形提升
char a = -1;
a为负数,其补码为1111 1111,占8个比特位
(vs 2013 默认为有符号的)char为有符号的char
整形提升时高位补充符号位 1
提升结果为:1111 1111 1111 1111 1111 1111 1111 1111 - 正数的整形提升
char b = 1;
b为正数,其补码为0000 0001,占8个比特位
char为有符号char
整形提升高位补充符号位 0
提升结果为:0000 0000 0000 0000 0000 0000 0000 0001
例:以下分别对无符号和有符号整形的整形提升现象进行验证,使用int和char类型变量来接收计算结果。