c语言整型提升规则表,c语言整型提升有什么实际用途
1.什么是正整数提升?
官方的解释是:
整数提升是C编程语言中的一个规则:在表达式计算中,各种整数都要先提升为int类型,如果int类型不足以表示,就提升为无符号int类型;然后执行表达式的运算。
2.整数提升规则
整数提升可以分为有符号和无符号两种。
有符号:提升整数时,根据变量的补码被截断时变量的最高位填充。如果截断后最高位(即最左边的位)的数字为1,则在最高位之前用1填充,如果最高位为0,则在最高位之前用0填充。如果用32位填充,则为int类型。
无符号:只需在截断的前面加上0。
直接看代码:
int main()
char a=-1;
有符号char b=-1;
无符号字符c=-1;
printf(a=%d\nb=%d\nc=%d\n ,a,b,c);
返回0;
}
上述代码的运行结果如下图所示:(编译器在计算过程中发生了整数提升和截断)
分析如图所示:
我们可以分几个步骤来看:
数字-1的补码是:111111111111111111111111111。当数字-1给A时,由于A、B、C的类型都是char,所以A、B、C中只能存储一个字节,所以只需要截断后八位。“这时就得到补码(因为整数在计算机中是以补码的形式存储的)。
在%d中打印需要整数提升。一个是a和b有符号数的最高位,然后在前面(最左边)加一得到:1111111111111111。c是无符号数,在前面(最左边)加零得到:00000000000011
然后转换成原始代码进行打印。a、B原码:100000000000000000000000001(补码相减求逆得到原码)。c原码:000000000000000000000000000000000000000001(整数无符号数原码=补码=补码)。最终结果是a=-1,b=-1,c=255。
再看另一个例子:
int main()
char a=3;
char b=127
char c=a b;
printf(%d\n ,c);
返回0;
}
粗心的老铁看到c=130,跑完之后结果是-126。为什么?
结合下面的分析:
我们可以分几个步骤来看:
数字3的补数是:0000000000000000000000000011。当数字3交给A时,由于A的类型是char,即只有一个字节,即A中只能存储8位,因此只需要截断最后8位,所以A中存储的位为:0000011。
数字127的补码是:000000000000000000000000000011111。同样,由于char类型的截断,B中存储的位是:0111111。
在执行a b的时候,8位的A和B要先进行整数升级,因为都是char类型,所以是有符号位。升级时补最高位0,补32位。后两者的补语是:
00000000000000000000000000000011
00000000000000000000000001111111
将a和b相加得到补数:
00000000000000000000000010000010
c是char类型,只能存储8位,所以需要截断。截断后,C中存储的位是:1000
以%d的形式打印需要32位,所以需要对C的整数进行升级,因为C的最高位是1,所以只要在最高位前面加1,就组成了32位。升级后补码为:111111111111111111111111111111111000
将补码转换成原码并打印出来。转换后的原码为:1000000000000000000000011110为负数,原码对应的整数为-126。
4.整数提升的意义
整数提升的意义在于,表达式的整数运算要在CPU相应的运算器中执行,CPU中整数运算器(ALU)的操作数的字节长度一般是int的字节长度,也是CPU通用寄存器的长度。所以,即使两个char类型加在一起,实际上也应该在CPU执行的时候,先在CPU中转换成整数操作数的标准长度。一般CPU很难直接实现两个8位字节的直接相加(虽然机器指令中可能有这样的字节相加指令)。因此,表达式中长度可能小于int长度的各种整数值,在送到CPU执行运算之前,必须先转换成int或无符号int。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。