unsigned类型值(无符整型)的减法

unsigned 类型值的含义是 0U-unsigned 类型值。
值小者减值大者会得到一个负数
然而unsigned类型表示的值的范围是[0, 232-1],即[0, 4294967295]。
PS:unsigned int 16、 0~65535 ;32 、 0~42亿
但是却在 int 型表示值(补码)的范围内,所以把这个int类型的值的补码形式理解为相同形式的unsigned类型。
比如:a-b=a[补码]+(-b)[补码]
CPU里只有加法器 没有减法器 做a-b运算时,实际上是做了a+(~b)
这里搬运一个博主的一个例子:


“50的二进制是: 00000000|00000000|00000000|00110010
100的二进制是: 00000000|00000000|00000000|01100100

50的补码是 00000000|00000000|00000000|00110010

-100的补码是 11111111|11111111|11111111|10011100

补码相加得到的结果是 11111111|11111111|11111111|11001110=4294967246

由于a-b得到的是无符号整形,所以原码与补码相等 结果自然为4294967246

原文链接:https://blog.csdn.net/Xiejunyi12/article/details/50654140”
——————————————————————————————————————

但是一开始有个疑问:由于无符整型的最高比特位不是符号位,所以永远比同比特位数的有符整型能表示的数要大和多,被减数能转换吗?比如4字节的 int 与 unsigned ,int范围是【-2147483648~2147483647】,而unsigned的范围是【0 ~4294967295】,
那么当一个unsigned型的减法如:0-23亿,转换时将 -23亿看作整型处理,明显溢出啊?
目前不知道是怎么回事。
哪位能教教我?
————————————————————————————————————————

在查询众多资料后,自己得到一个解释,下面自己说一下对疑问的看法:

归根结底,回到补码的问题:
两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃
负数的补码就是反码整体加一。符号位上的进位舍弃。(所以,舍弃了符号位的补码的第一位是数值位,不是符号位,符号位舍弃了)
另外解释一下原码符号位和补码符号位的关系,补码的符号位不是保持原码的第一位不变,而是 符号位不变。
当然,前提是你表示的数将要溢出的情况。
然后,我写了个上述的 0-23亿 的运算语句运行了一下,得到的是正数,从侧面反映当比特位数不够时,符号位是会被丢弃的。
————————————————————————————————————————

主要资料来源与博客园,我转载了一部分:转载部分
原网页:传送门

你可能感兴趣的:(C/C++笔记)