在c语言中,我们知道:当你要进行两个数进行计算时,它们至少是int类型,当我们对char or short类型(即大小小于int)的数进行计算时,会发生整形提升。
举个例子
我们设置两个char类型的变量a,b
对它们加和的结果进行打印,由于a,b大小是小于int的,这时a,b会进行整形提升
首先将a,b转换为二进制
a=00001010 b=00010010
这里由于aa,b是char类型所以只取后八位(刚好一个字节)
根据整形提升的规则,对于有符号的数,空余的位补上符号位
得到的结果
a=00000000000000000000000000001010
b=00000000000000000000000000010010
最后应当能得到的结果是30,下面来验证一下答案
好,没有问题。
在经过上述了解后,我们也将进入本篇文章的主题
c语言中整形提升的逻辑是什么呢?
接下来给大家带来我个人探索出来的部分结果,有不足的地方希望大家能做补充。
在c语言中我们知道整形有signed 和unsigned类型,一般的,char int short long等前面没带unsigned的情况下我们都默认它们是signed类型
那么对于signed类型和unsigned类型的整形在提升时,其实是有区别的
以及我们在打印时选用%d or %u时的结果也有所不同。
如图所示
那么我们该如何去理解这些区别呢?
当我们设置得到变量为unsigned类型时,如图中的a。无论我们选择哪种打印方式,得到的结果相同,这说明了一个情况,对于a=10000000,在进行整形提升时,空余位上都是补0(即遵循无符号整形提升的规则);
所以能得到a=00000000000000000000000010000000
而对于signed类型的b=10000000来说,在进行整形提升时,却产生了不同的结果
下面我们分别来实现一下两种情况
%u b=10000000 b=11111111111111111111111110000000
%d b=10000000 b=11111111111111111111111110000000
我们选择unsigned类型时,即默认b是没有符号位的,尽管b的首位是1。所以这里我们会直接认为它是正数,得到的便是图中的结果
而在选择signed类型时,由于b是有符号位的,而负数在内存中存储的形式是补码,所以要将其转换位原码才能得到最终的结果
即b=10000000000000000000000010000000
最后的结果是-128。
最后我要陈述的结论:我们在整形提升时空位上补符号位还是补0取决的是变量的类型,而不是我们所选择的%d or %u的类型,以及在打印时是否要对补码进行转换取决的是选择打印的类型(这里因为正数的原返补都一样,写补码便于陈述)
本篇文章到这里就结束了,有什么补足的地方希望大家能够指出,我会加以改进!