原码:最高位被用来表示正负符号的二进制表达
既然如此,先把十进制转换成二进制吧
🌰: 把十进制的38和-17转换成二进制⬇️
2| 38 0 2| -17 1
2| 19 1 2| 8 0
2| 9 1 2| 4 0
2| 4 0 2| 2 0
2| 2 0 2| 1 1
2| 1 1 0
0
所以38的二进制表达是100110 (依次取每次模2的余数),
-17的二进制表达是-10001。
因为计算机的存储容量通常以字节为单位,
一个字节又是相连的8个二进制位组成的,
所以我们接下来用0把其它位给补上吧
(以一个字节为例)
38 ➡️ +100110 ➡️ +00100110 (这是就是它的真值)
-17 ➡️ -10001 ➡️ -00010001 (这也是它的真值)
前面提到原码的最高位被用来表示符号,
”0”表示正号,而”1”表示负号,
所以我们又可以用一次➡️了:
38 ➡️ +100110 ➡️ +00100110 ➡️ 00100110 (整好是0)
-17 ➡️ -10001 ➡️ -00010001 ➡️ 10010001 (最高位0变成1了)
好了,这就是它们的原码了,我们已经成功三分之一了!
接着看看吧!
工具人反码:
负数的反码是把它的原码最高位(即表示±的那位)以外的每一位取反 (把1换成0,把0换成1)。
正数的呢?就是它的原码,不变。
上面知道,
[38]原=00110010 [-17]原=10010001
所以,[38]反=00110010 [-17]反=11101110
补码:
负数的补码是它的反码加1,正数的补码还是它的原码。
所以,原码是怎么通过反码娶到补码实现减法运算的?😍
计算机的基本运算只有加法,做乘法也是一个一个地加。
那减法呢?😑
加!,还是加,加到负数去!
计算机是二进制的,所以我们理所当然要用二进制表示负数啦,也就是补码了。
那补码怎么就可以表示负数,她连标点符号都没有…🥺
我们知道,每一个负数都有一个为正的相反数,
既然它们关系这般好,不妨试试用正数表示它的为负的相反数,
这样就不用理标点符号啦。
说干就干!
设 x,y是一对相反数,
则 x+y=0, 慢着,我们要用二进制!
好吧,重来!
则 x+y=00000000 (同样以一个字节为例)
这样看啥子啊,给x,y随便赋值看看!(就38和-17了)
令 x=00110011,
y=10010001
令x+y= 00000000,怪麻烦的,要进位。。。😨
那如果是11111111呢?
咦?好像可以,😗
要让x+y=11111111,只要…
x是y的取反啊,
这样,x和y的每一位相加都是1+0=1,
全部位合起来不就是11111111了嘛。
但我们要的是00000000啊,🙄
加1试试呗,
11111111+00000001=100000000,这也不是啊,🤔
仔细想想,你是不是忘了什么?
我们是以一个字节为例的啊,
计算机这时就只能用8位来存储数字啊,
那多出来的一位呢?😮
不要了,不要了。
所以去掉最高位1,不就是00000000吗?
真是山重水复疑无路,柳暗花明又一村,船到桥头自然直……
诶😩,我们先把补码娶出来吧🥰,
设 x+y=11111111
等号两边同时加1
x+y+1=11111111+00000001
即 (x+1)+y=00000000
所以x+1和y是一对相反数,
如果y是我们要表示的负数e的绝对值,
那么把y的最高位保留,其它位取反,
就得到x 了(x+y=11111111)(x是反码)
再把x加1就得到y的相反数(x+1)了,
x+1是y的相反数,负数e也是它的绝对值y的相反数,
所以x+1和负数e在某种意义上来说是相等的。
所以我们就用x+1(没有负号的补码)表示出那个负数e了。
所以,我们就可以通过补码(也就是x+1)进行加法运算来完成减法运算了。
用上面的栗子测试一下吧:
[38]补=00100110 [-17]补=11101111
[38]补+[-17]补=00010101=1+4+16=21,正确!
———————————————————————————————————————————
参考文章链接:https://blog.csdn.net/jiange_zh/article/details/47381115