只是为了:简化硬件,节省资金。
因为负数可以用正数代替(补数)。
如:24-1=23
24 99=(一百)23
忽略进位,用99代替-1。
99是-1的补数。计算机使用二进制,称为:补码。
用补数(正数)代替负数,那么电脑里就没有负数了。
因此,在计算机中,只有加法。
所以,在计算机中,你只需要设置一个加法器,就可以进行加减运算。
在计算机系统中,数据总是用补码来表示和存储。
原因是有了补码,加减就可以统一了。
补码就是补码,与原码的补码无关。
你可以 不理解 为什么要用补语? 。
–
补语实际上是a 正数代替负数运算。quot。
例如,十进制运算:
24 – 1=23
24 99=(一百)23
弃进位,99可以代替-1。
这时候减法就转化为加法了。
那么,99叫做-1的补数。
丢弃进位是一个2位数的十进制计数周期:10 ^ 2=100。
大家可以推导出求补数的公式:负周期。
–
其实在三角函数中,大家都知道:
-/2和3/2,这两个角的作用相同。
负角和正角怎么换?
还用到公式:正角=负角周期(2)。
–
计算机用二进制,补码,所以叫:补码。
8位二进制的计数范围是:0000 0000 ~ 1111 1111。
转换成十进制,即:0 ~ 255。
计数周期为2 ^ 8=256。
那么-1的补码就是255(也就是1111 1111)。
-2的补码是:-2 256=254=1111 1110。
-128的补码是:128=1000 0000。
这是可以用八位二进制表示的128个负数。
求补数的公式还是:负句号。
正数可以直接运算,不需要变换。
所以正数根本没有补数。
–
要找到补码,你不要 不需要联系 原始代码的符号位被反转并加 。
那些乱七八糟的东西没必要。
外国人不擅长数学,所以他们别无选择,只能做这些 道路封锁 诡计。
在计算机系统中,数值总是用补码来表示和存储。
8位二进制代码,有2 ^ 8=256种组合。
如果设计合理,它们可以代表256个数。
但是原码和反码都是有缺陷的,一个0占了两个码位。
所以原码的8位反码只能代表255个数:-127 ~ 127。
(在计算机中,不使用原码和反码的缺点也是原因之一。)
补码的设计方案很完善,数字和代码一一对应。
因此,8位补码可以表示256个正数和负数。
其范围为:-128 ~-1,0~ 127。
因此,在计算机系统中,数值总是用补码来表示和存储。
原码和反码都不存在电脑里。
【toc】开门见山,我觉得最重要的原因有两个:之前网上搜到的大部分原因都解释了第一点,解释有说服力。所以我 我先在这里说第二点,规则是一致的,这是我看了《深入理解计算机系统》公开课后学到的。
哔哩哔哩对计算机系统公开课深有体会(带中文字幕,强烈推荐)。对了,研究这类问题的时候,可以想清楚,而不是用一个大数。
假设我们有一台只有4位的计算机来计算乘法-2 * -3的值。如果用原码或反码计算,注意乘法的计算规则是:直接截断保留最低4位,保留后最高位为符号位。-2 ;s补码:1110转换为无符号数(十进制):14-3 ;s补码:1101转换为无符号数(十进制):13无符号数14 * 13=182转换为二进制且只保留最少4位:0110(0110的十进制为6,等于正确答案)-2。
制) : 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, 其他位都是正值,加起来就行了。
补码,其实就是一个“代替负数”的正数。
使用了补码之后,在计算机内部,就没有负数了,
从而,也就没有减法运算了。
因此,利用补码,就可以简化计算机的硬件。
而原码和反码,都没有这种功能。
所以,在计算机中,原码反码,都是不存在的。
-----------
补码(一个正数),怎么就能代替负数呢?
你看,2 位 10 进制数的运算:
25 - 1 = 24
25 + 99 = (一百) 24
舍弃进位,只取 2 位数,结果,是不是相同的?
99,就称为-1 的补数。
98,就是-2 的补数。
补数,是怎么算出来的?
公式,你都可以自己推导:
补数(正数)=负数+周期(10^2)。
正数,本身就是正数了,不需要作任何变换。
所以,正数,并没有补码。
------------
计算机的运算,位数,也是限定的。
8 位机,每次运算,就是 8 位 2 进制。
那么,-1 的补码,就是:
-1 + 2^8 = 255 = 1111 1111 (二进制)。
如 25 -1 = 24,用补码计算如下:
25 = 0001 1001
[-1]补码 = 1111 1111
--相加---------
得: (1) 0001 1000 = 24
舍弃进位,保留八位的结果,这就是 24。
-------------------------
补码的来源,与原码和反码,毫无关系。
所以,学习原码和反码取反加一符号位不变,都是做无用功。
老外数学不好,才会用使用这些骚操作。