C语言--整型提升--源码反码补码转换

整型提升:指将字符类型和短整型转化成普通整型。分为有符号和无符号两种,有符号的情况下,已补码的最高位此进行补位,例如最高位为1,这用1进行补位,补至int类型的32bit。若最高位为0,则用0进行补位。无符号数则在前面直接进行补位。

例题:

将125赋值到中,125的二进制是00000000 00000000 00000000 01111101,将其赋值到char类型的a中时,要发生截断。因为char类型只占用一个字节,故a的值为 01111101。同理,10的二进制为00000000 00000000 00000000 00001010,b的值为00001010。

当a和b相加的时候,要进行整型提升。

a为01111101,最高位为0,则用0进行补位,为00000000 00000000 00000000 01111101

b为00001010,最高位为0,也用0进行补位,为00000000 00000000 00000000 00001010

a和b二进制相加为 00000000 00000000 00000000 10000111

将a加b值赋值到c里,c为char类型,所以要发生截断,c为 10000111。

打印时,打印的是整型c,所以c要再次进行整型提升。又因为char可代表有符号字符,所以要根据最高位的数字进行补位。

c的二进制的最高位为1,所以用1进行补位为 11111111 11111111 11111111 10000111,补位后得到的为整型的补码,将补码转变为源码,为 10000000 00000000 00000000 01111001.最高位为符号位1代表为负数,故将二进制转换成十进制为-121。

故第一个printf输出-121。printf("%d\n", a + b)。

a与b整型提升后为相加得到的二进制 00000000 00000000 00000000 10000111,打印的就为int整型的形式。将二进制转化为十进制后为135。

故第二个printf打印出的为135。

插入一个小知识点(源码,反码,补码的转换)

在内存中储存的是一个数的补码。对于正数而言,源码,反码,补码的只是一样的。而对于负数而言:源码除最高位的符号位取反等于反码,反码+1等于补码,补码变为源码时,可直接取反(除符号位不变)加一。

如:‘-1’

源码:10000000 00000000 00000000 00000001                ---- 进行( 除符号位不变)取反,得到

反码:11111111 11111111 11111111 11111110                        ---- 进行 +1,得到

补码:11111111 11111111 11111111 11111111                        ---- 进行取反(除符号位不变)加一

源码: 10000000 00000000 00000000 00000001

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值