彭尼玛 发表于 2018-9-18 10:27:52

关于二进制的补码,看了甲鱼哥的那篇关于补码的还是不是很懂

首先,假设我128-128=0那么就等于 128+(-128)=0
现在用二进制来表示这2个数。
128是:1000,0000;
-128是,我看说是取反:(符号位不动,其他位取反就是负数):1111,1111;
那这样2个数加起来就是——:    1,0111,1111   
因为是只有8个位的,所以第9位的1被吃掉了,就是剩下0111,1111   其中0是符号位表示的是正,那这个数就是 +127??
显然这个数是错误的……
可是那错误为什么要有“反码”这个说法呢??

另外,如果是 “补码” 的话,就对的。
-128的补码是,反码+1 那就是 1111,1111+1=1,0000,0000。
128+(-128)=1000,0000+1,0000,0000=1,1000,0000。去掉第9位,就是1000,0000。
其中1000,0000的1表示符号位 负。那么这个结果就是(-0)??
这样我感觉也有点奇怪,是不是我哪里有问题??

claws0n 发表于 2018-9-18 12:15:29

1000,0000 这是 128, -128,前面多加一个 1
1,1000,0000
1,0111,1111    取反
                  1   把溢出加回来
   1000,0000    二进制的正负 128 都是一样的

彭尼玛 发表于 2018-9-18 13:05:02

claws0n 发表于 2018-9-18 12:15
1000,0000 这是 128, -128,前面多加一个 1
1,1000,0000
1,0111,1111    取反


一般用补码方式表示,举例说明:
-52,假设存储的数据是8位二进制数,即8位二进制补码
先将52转换成二进制数:00110100B
取反:11001011B
加1:11001100B
则-52D的8位二进制补码为11001100B
如果已知11001100B是有符号数,因为最高位是1,则这个码是用补码表示的一个负数
11001100B减1=11001011B
取反=00110100B=52D
则可知:11001100B是-52D的补码表示

刚刚在网上找的。好像他没在最前面+1。(就是大哥你所说的1,1000,000)
我也明白我是哪里有错了,我是太纠结于符号位了,其实不管如何,直接取反再+1既可,不用考虑符号位_(:з」∠)_

claws0n 发表于 2018-9-18 13:35:00

彭尼玛 发表于 2018-9-18 13:05
一般用补码方式表示,举例说明:
-52,假设存储的数据是8位二进制数,即8位二进制补码
先将52转换成二 ...

52 小于 64,小于128,位置够用,不需要另外加

彭尼玛 发表于 2018-9-18 14:09:31

claws0n 发表于 2018-9-18 13:35
52 小于 64,小于128,位置够用,不需要另外加

恩恩_(:з」∠)_我试着128不加,好像也一样活的一样的答案_(:з」∠)_因为都会越界归0
页: [1]
查看完整版本: 关于二进制的补码,看了甲鱼哥的那篇关于补码的还是不是很懂