关于c语言中整形提升的部分见解

在c语言中,我们知道:当你要进行两个数进行计算时,它们至少是int类型,当我们对char or short类型(即大小小于int)的数进行计算时,会发生整形提升。

举个例子

f3fd3eca8a224eb7b338399594b7a647.png

我们设置两个char类型的变量a,b

对它们加和的结果进行打印,由于a,b大小是小于int的,这时a,b会进行整形提升

首先将a,b转换为二进制

a=00001010       b=00010010

这里由于aa,b是char类型所以只取后八位(刚好一个字节)

根据整形提升的规则,对于有符号的数,空余的位补上符号位

得到的结果

a=00000000000000000000000000001010

b=00000000000000000000000000010010

最后应当能得到的结果是30,下面来验证一下答案

dea1a701bcb1430e92cb87abe308f4d5.png

好,没有问题。

在经过上述了解后,我们也将进入本篇文章的主题

c语言中整形提升的逻辑是什么呢?

接下来给大家带来我个人探索出来的部分结果,有不足的地方希望大家能做补充。

在c语言中我们知道整形有signed 和unsigned类型,一般的,char int short long等前面没带unsigned的情况下我们都默认它们是signed类型

那么对于signed类型和unsigned类型的整形在提升时,其实是有区别的

以及我们在打印时选用%d or %u时的结果也有所不同。

如图所示

b2edd7cdf151434cb095485c0f604203.png

那么我们该如何去理解这些区别呢?
当我们设置得到变量为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的类型,以及在打印时是否要对补码进行转换取决的是选择打印的类型(这里因为正数的原返补都一样,写补码便于陈述)

本篇文章到这里就结束了,有什么补足的地方希望大家能够指出,我会加以改进!

 

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值