发布网友 发布时间:2023-03-22 20:42
共2个回答
热心网友 时间:2023-10-12 00:23
[toc]
开门见山,我认为有两点最重要的原因:
之前在网上查资料,查到的原因大多数都是解释了第一点,而且解释的有理有据令人信服。
所以我这里先说第二点,规则一致,这个是看了 深入理解计算机系统 的公开课学到的。
B站深入理解计算机系统公开课(有中文字幕,强烈推荐)
顺便提一嘴,研究这种问题不要用很大的数去想,就用4位数去思考反而能想的很清楚。
假设我们有一个只有4位的计算机,计算乘法 -2 * -3 的值。如果使用原码或者反码进行计算,
注意,乘法的计算规则是:直接截断保留最低4位,保留后的最高位即为符号位。
-2 的补码: 1110 转换成无符号数(十进制): 14
-3 的补码: 1101 转换成无符号数(十进制): 13
无符号数 14 * 13 = 182
将182 转换成 二进制 并且只保留最低 4 位: 0110 (0110的十进制是 6, 等于正确答案)
-2 的原码: 1010 转换成无符号数(十进制): 10
-3 的原码: 1011 转换成无符号数(十进制): 11
无符号数 10 * 11 = 110
将110 转换成 二进制 并且只保留最低 4 位: 1110 (1110的十进制是 -6 或者 14,均不等于正确答案 6)
如果你觉得这是个巧合,那么可以自己试几个数算一下,或者用反码也算一下,看看是什么结果。
可以简化硬件的计算,因为硬件就是单纯的电路板,它可不知道什么符号位,它能做的就是把接收到的两个值做运算。
如果计算机使用原码,那么是不是cpu需要准备两套运算电路,运算前还要做个 if else 判断?一套给有符号数用,一套给无符号数用。这样子会造成极大的资源浪费。
但是如果我们使用补码,就可以让硬件无脑的计算再截断好了,反正最后的值不论是 有符号 还是 无符号, 都能得到正确的答案。
由于讲这个的太多了,这里就简单说一下(不写反码了,直接用补码举例)。
用整数 1 来做个实验,
1 的原码是 0001,补码是 0001。
-1的原码是1001,补码是 1111。
如果你让 1 和 -1 的原码相加,那么他们很明显不得 0, 但是补码相加溢出再截断,最后等于0 。
至于为什么会这样?因为补码的定义就是这样啊
用我自己的话总结:补码就等于现有的位再加一位,新加的位等于1,其余都为0 。减去当前的原码,就成了补码。
用例子来说就是 10000 (总共5位) 减去 1 的原码 0001, 就等于 1 的补码 1111 。
10000 - 00001 = 1111
用 -1 举例 , -1 的补码 1111
这四位不是对应着 8 4 2 1 嘛,那么直接把 最高位 的值 乘以 -1, 其他位都是正值,加起来就行了。
-8*1 + 4*1 + 2*1 + 1*1 = -1
比如 -3, -3 的补码 1101
-8*1 + 4*1 + 2*0 + 1*1 = -3
热心网友 时间:2023-10-12 00:23
在计算机中,负数,以其正值的补码形式表示。
就是说,负数,是用一个正数(即补码)来表示的。
使用了补码之后,在计算机中,就没有负数了。
同时,也就消除了减法运算。
那么,计算机,只需配置一个加法器,便可横行天下。
原码和反码,都没有这种功能,所以,计算机根本就不用它们。
-----------------
补码(一个正数),怎么就能【代表负数】呢?
其根源在于“计数系统的周期性”。
你看,两位十进制(0~99),计数周期就是 10^2 = 100。
那么将有:
24 - 1 = 23
24 + 99 = (一百) 23
你只要保持两位数,忽略进位,+99 就能代表-1。
同时,减法,也就用加法运算实现了。
算法公式:代替负数的正数 = 负数 + 周期。
这个公式,也可在计算机中应用。
在一个字节中,是 8 位 2 进制,周期就是 2^8 = 256。
那么,计算公式就是:正数 = 负数 + 256。
-1 就可用 255 = 1111 1111 (二进制) 代替。
-2 可用 254 = 1111 1110 代替。
。。。
这些“替代品”,就是补码。
只有负数,才需要转换成正数。
零和正数,必须直接参加运算,不可转换。
所以,正数,并没有补码。