鱼C论坛

 找回密码
 立即注册
查看: 1646|回复: 5

[已解决]关于补码的两个疑问

[复制链接]
发表于 2018-10-16 23:22:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.使用补码的好处原文
小甲鱼:对的,正数的补码是其本身的二进制形式;负数的补码需要先将其绝对值按位取反,再 + 1。

              比如 -3,就是先将 10000011 按位取反(除了符号位),得到 11111100,再 +1 得到 11111101
这里的绝对值是什么意思是指数学的觉得值吗那么符号不该全为正吗?1000 0011绝对值0000 0011

2.1000 0100=-4的补码是1000 0100按位取反(除符号位) 得1111 1011,再加一 这里是不是需要进位变成1111 1100 如果这么算的话  把0归为整数的原因是不是就是防止-0的补码溢出了?
最佳答案
2018-10-17 10:25:53
我没看过原文,单纯从数电基础跟你说说,计算机硬件只有加法器,没有减法器,所以所有减法都是换算成加法运算的,而补码就是为了将减法换算成加法而诞生的。
首先是补码的原理:现在是9点,而一个表现在的指针指在11点,我们想调整的话,可以做减法运算,11-2,逆时针调两个格。而如果这个表只能单向调整的话,我们可以顺时针调10个格,同样能指向9点,这个10就是2的补码(这里是12进制,反码的对应关系是0-11,1-10,2-9,3-8)。
搁到2进制这里,由于首位是符号位,是用来表示正负数的,所以这位是不参与补码转换的,总不能让1111与0001相等对吧?那么为什么1111就能与1001对等呢?(这里第一位的1是符号位)
举个例子这里先单纯做一下不带符号位的数值运算:0110 - 0101 = 0001;0110 + 1011 = 10001。
前边加上符号位就变成了:00110 + 10101 = 00001(这里是人类的视角,先把符号位的转化为负号,再运算00110 - 00101,再判断正负);而计算机的视角是这样的:首先10101已经转换成补码11011了,然后计算是,00110 + 11011 = 100001,这里标红的高位1没地方存储,那就不要了,所以,就变成了00001,即+0001。
我们再算个负数比正数大的:人类视角:00101 + 10110 = 10001 。计算机视角:00101 + 11010 = 11111,注意了,结果由于也是以补码的形式存储的,所以结果的原码也就是10001。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-10-16 23:33:12 | 显示全部楼层
将其绝对值  说的是数学方面的


1111 1100  如果有符号位 那么说明 可能是-4 也可能是 252

具体看看这个
https://www.cnblogs.com/maoypeng/archive/2018/06/01/9123826.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-17 10:25:53 | 显示全部楼层    本楼为最佳答案   
我没看过原文,单纯从数电基础跟你说说,计算机硬件只有加法器,没有减法器,所以所有减法都是换算成加法运算的,而补码就是为了将减法换算成加法而诞生的。
首先是补码的原理:现在是9点,而一个表现在的指针指在11点,我们想调整的话,可以做减法运算,11-2,逆时针调两个格。而如果这个表只能单向调整的话,我们可以顺时针调10个格,同样能指向9点,这个10就是2的补码(这里是12进制,反码的对应关系是0-11,1-10,2-9,3-8)。
搁到2进制这里,由于首位是符号位,是用来表示正负数的,所以这位是不参与补码转换的,总不能让1111与0001相等对吧?那么为什么1111就能与1001对等呢?(这里第一位的1是符号位)
举个例子这里先单纯做一下不带符号位的数值运算:0110 - 0101 = 0001;0110 + 1011 = 10001。
前边加上符号位就变成了:00110 + 10101 = 00001(这里是人类的视角,先把符号位的转化为负号,再运算00110 - 00101,再判断正负);而计算机的视角是这样的:首先10101已经转换成补码11011了,然后计算是,00110 + 11011 = 100001,这里标红的高位1没地方存储,那就不要了,所以,就变成了00001,即+0001。
我们再算个负数比正数大的:人类视角:00101 + 10110 = 10001 。计算机视角:00101 + 11010 = 11111,注意了,结果由于也是以补码的形式存储的,所以结果的原码也就是10001。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-17 14:55:09 | 显示全部楼层
1.这里绝对值是指将负数先取绝对值后变成正数,比如-3,取绝对值3,二进制00000011.
然后在按位取反得11111100,再+1,得11111100。

2.需要进位,这样正好解决了正零00000000,负零11111111+1=00000000问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-10-17 19:05:38 | 显示全部楼层
pheron 发表于 2018-10-17 10:25
我没看过原文,单纯从数电基础跟你说说,计算机硬件只有加法器,没有减法器,所以所有减法都是换算成加法运 ...

懂了懂了 实际上钟表就是值模12同余 反码是模127同余,补码是反码基础上加1模128同余
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-10-18 09:08:13 | 显示全部楼层
2268194521 发表于 2018-10-17 19:05
懂了懂了 实际上钟表就是值模12同余 反码是模127同余,补码是反码基础上加1模128同余

人的思维很复杂,而计算机的就很简单了,补码等一系列规则都是人用复杂的思维为计算机归纳出来的简单规律,其实只要知道结论就行了,正数的补码是自身,负数的补码是他值的反码加一,符号位不变。
计算机是直性子,你告诉他一个结论,他就会耿直的执行,数值直接就是以补码的形式存储在计算机里的,在计算机的思维里就没有减法这一概念,全是加法。减法多麻烦呀,先得比较两个数确定结果的正负,然后还得经过按位运算得出值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-30 13:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表