废话不多说直接进入主题:无符号的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。

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

5682

被折叠的 条评论
为什么被折叠?



