1.原文总结:
原码表示直观但是做运算时仅仅是绝对值进行了运算遇到负数就会出问题。
反码运算正数范围内玩没问题,负数范围内玩也没问题,但是当你从负数迈到正数的时候会经过两个0(-0,+0)两个零重复表示了。
补码运算都没问题。
上面文章中有一个问题更正一下。
如果用反码进行运算负数和负数相加总是会比正确结果小1。
例: -1的原码 1000 0001 反码 1111 1110
-1 + -1 = 1111 1110 + 1111 1110 = 1111 1100
1111 1100是反码 变成原码就是 1000 0011 是 -3 而 -1 + -1应该是-2
原因是有两个0 导致的所以后面就有人想出了给负数的反码都加1变成补码去运算
2.补码没有-0
原码 -0 表示为 1000 0000 它的补码是 0000 0000
源码 +0 表示为 0000 0000 它的补码是 0000 0000
所以补码没有-0,那补码的1000 0000 则表示为 -128 这也就是为啥只有 -128 到 127
计算机中都是补码进行运算和存储的
原码没有-128的写法。
3.为什么会想到反码这个东西?
原码的运算规律就是绝对值相加如果用原码来计算 -1 + 1
即 1000 0001 + 0000 0001 = 1000 0010 为 -2就是符号位没有变绝对值加1这个运算规律明显不符合负数的运算规律,反码虽然有+0和-0的问题,但是它的运算规律确实是正确的,为什么反码的运算规律是正确的
这其实是一个障眼法:
举一个经典的例子,我们日常生活中的12个刻度的时钟,它表示0-12小时。假设它现在处于2的位置,如果你要让它减少4个小时,到10的位置,你会怎么做?把时钟顺时钟按照3,4,5的方向转8个小时?还是按照1,12,11的方向逆时针转动转4个小时?这2者的结果都是一样的,让时钟到了10的位置。我们来看一下,一个是拨了8小时,一个是拨了4小时,8+4=12,12-8=4。一个时钟一圈12个小时,也就是说最大的表示上限是12。往前8小时和往后12-8=4小时效果是一样的。而这个12就是所谓的【模】。在模的范围内,+某个数x与+模-|x|的效果是一样的。
那我们在计算机中数据类型都是固定长度的,所以有模。
举个例子假如数据类型的长度是1byte 那它的模是 1111 1111
如果是 - 1 怎么表示,我们用公式 模 - |x| = 1111 1111 - 0000 0001 = 1111 1110 正好是 -1的反码