C语言设计中的unsigned int 和signed int的区别解释

本文探讨了C语言中无符号整型(unsigned int)和有符号整型(signed int)的差异,特别是在计算机存储和运算过程中的行为。通过代码示例解释了负数在补码表示下的计算规则,以及%d和%u格式化输出时的影响。

废话不多说直接进入主题:无符号的int和有符号的int的理解和代码演示,首先要知道计算机存储和运算数据都是按照补码方式存储的,不过int是负数的时候呢?

这就涉及到了数据的 原码  反码 补码,正数的原码和补码是一样的,反码的话就是~(取反)

负数的话 原码 的最高位是用来表示符号位的 0是整数 1是负数,反码~(除了符号位)、

补码就是在反码的基础上+1

下面用代码举例子:

 

上面b=-20 在计算机存储是补码的形式 -20的原码是 1000...10100,先求反码~得1111...01011

接着反码+1就是补码:1111...0101100在计算机中存储

在计算int和uint 时会把int当做uint参加运算 也就是全部bit都是数据bit,所以这里的-20如果和6对比的话是会输出 “>6”的。6的原码和补码相同都是0.....110  而此时的-20是1111...0101100 显然都当做是uint 来对比的话 -20一定是大于6的 32bit都是数据

下面说下%d和%u来输出控制:上面uint a=6 用%u来输出的话是6   而int b=-20也用%u 输出的却是 4294967276 显然b -20是大于 a 6的。

那(a+b)为啥输出-14呢?   -14不是比6小吗?

这是因为刚才上面说的运算时会当做uint来运算然后返回结果 然后%d输出-14, uint是全部数据bit 没有最高位符号位的。

其次 相关资料显示,我们C中%d与%u 程序去解释这⼀变量的数据的时候 是有区别的,
这里 %d在解释过程中第⼀位数据表示的是符号bit   

所以   (a+b)= -14    b= -20

而%u第⼀位数据表示的是数据bit

所以  b %u输出结果是 4294967276。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值