为什么int的负数绝对值比正数最大值大1

这是刷题时遇到将负数直接变成正数溢出遇到的问题,然后就去百度了一下,总结如下。

首先是说负数的二进制表示,比较好理解的就是课本上说的,对应的正数的原码,取反码,反码是对原码按位取反,符号位除外,然后加1,也就是说用补码来表示。

比如说-3吧,以八位为例,对应原码是1000 0011,对应的反码就是1111 1100,然后加1,所以-3在二进制中的表示就是1111 1101。

这样直接理解呢,8位有符号数无法表示128的原码,因此-128是没有反码的,只有原码和补码,这个可以直接为1000 0000是规定的128。

但是还有一种更好的理解方式,就是补码不按课本上理解,按减法取模来理解:

x的补码=256 - |x|,这里是都按无符号数来理解,这样的话,就可以理解1000 0000的补码和反码都是自己,以刚才的-3为例0000 0011 = 3 加上 1111 1101 =  253 就是256了。

参考文章:https://blog.csdn.net/z69183787/article/details/78545519

你可能感兴趣的:(为什么int的负数绝对值比正数最大值大1)