C语言关于整型提升的思考

什么是整型提升?

整型提升是较小的整数类型(如charshort)会被自动转换成较大的整数类型,通常是intunsigned int(取决于具体情况和原始类型的大小)。

1.无符号数

以32位平台为例:

该程序定义了一个无符号char类型的变量a,我们知道,数值在计算机中是以补码形式存储的,所以我们首先要看出a的补码

原码反码补码转换规则是:正数的原码反码补码相同,负数的反码等于原码除了符号位之外的各位取反,补码等于反码加1。

-128的原码:10000000,00000000,00000000,10000000

-128的反码:11111111,11111111,11111111,01111111

-128的补码:11111111,11111111,11111111,10000000

而a是unsigned char类型,它只有一个字节大小,所以只能容纳-128的低8位,此时a里面装的是10000000。

而打印a时,%u表示我要打印的是一个无符号数,而一个字节大小的a怎么表示四个字节大小的无符号数呢,于是就有了整型提升。

a的10000000仍放在最后一个字节,无符号数的高位补0,前面三个字节皆为0,

于是要打印的变成了00000000,00000000,00000000,10000000为128

2.有符号数

有符号数会稍微复杂一些,但也就是正数高位补0,负数高位补1 。

同样是32位平台

该程序定义了一个有符号char类型的变量a

步骤同上:

-128的原码:10000000,00000000,00000000,10000000

-128的反码:11111111,11111111,11111111,01111111

-128的补码:11111111,11111111,11111111,10000000

a内容二进制表示是10000000,其中1是a的符号位,而打印a进行整型提升时,由于a的符号位是1,所以系统自动将提升后的符号位及高位补充1,也就变成了这样:11111111,11111111,11111111,10000000。%u将其当做无符号数打印,结果是:

a赋的值是128的话和上述结果也是相同的,大家可以去验证。

小小的变动一下:

猜测一下打印的结果是什么?

先看-129的补码:11111111,11111111,11111111,01111111

0成为a的符号位,打印进行整型提升时,高位和符号位要补0,即00000000,00000000,00000000,01111111

结果如下:

另外需要注意的是,我这里打印输出使用的是%u,如果使用的是%d,需要注意输出时计算机将补码转换成原码的过程。

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值