你真的知道計算機是如何進行減法運算的嗎?

_Fatman發表於2021-05-31

在這裡插入圖片描述
問:現在的時間是3點鐘,如何轉動時針,讓時間到達2點鐘呢?
答:減去1小時,亦或是加上11小時。

在這裡插入圖片描述

問:圖中一個位元組的無符號數值,它代表十進位制資料 2, 如何讓它變成1呢?
答:減去1,亦或是加上255。

因為時鐘旋轉一週為360°,所以順時針旋轉330°,也就等於逆時針旋轉30°(360° - 330°);
因為一個位元組的無符號數值最多表現為256種數值狀態,所以減1,也就等於加255(256 - 1)。

也就是說:

   2 - 1

= 2 + (256 - 1)

= 2 + 255

= 257

= 257 - 256(減去溢位位)

= 1

   0000 0010 - 0000 0001

= 0000 0010 + 1111 1111

= 1 0000 0001

= 0000 0001

反過來說,順時針旋轉-30°(逆時針旋轉30°),也就等於順時針旋轉330°;
加上-1(減去1),也就等於加255。

因為無符號數值無法表示負數,這裡再加入有符號數值的概念。
在這裡插入圖片描述
這是一個位元組的有符號數值,它代表十進位制2。

有符號數值與無符號數值的區別在於:
無符號數值中只有資料位;
有符號數值中除了資料位,還包含符號位。
當符號位為0時,代表整個數值為正數;
當符號位為1時,代表整個數值為負數。

此時的資料位只有第0位到第6位,一個位元組的有符號數值的資料位最多表現為128種數值狀態,再算上符號位有兩種狀態,所以總的來說還是有256種數值狀態。

   2 - 1

= 2 + (256 - 1)

= 2 + 255

又因為減去一個數等於加上這個數的負數,所以:

   2 - 1

= 2 + (-1)

從而可以得到:
在一個位元組的數值中,加上-1和加上255(雖然現在的取值範圍不包括255)是一樣的,所以-1的有符號二進位制形式為1111 1111。

a、b皆為正整數,且a、b現有n種數值狀態:

a - b = a + (-b)

a - b = a + (n - b)

由此可得:

a + (-b) = a + (n - b)

-b = n - b

停住,求到這一步已經可以了,再求下去就是n=0了

接下來代入本篇文章最開始的問題,因為鐘錶是12小時為一圈的,所以n為12,3點調到2點,a為3,b為1

-1 = 12 - 1

-1 = 11

a - 1 和a + 11都等於2

要理解這個點,一定不能把數值看作一條直線,而應該看成一個圓圈。

鐘錶以12小時為一圈,它的取值範圍是在1 ~ 12之間,所以減去1就是加上11;

一個位元組的無符號數擁有256個數值,它的取值範圍是在0 ~ 255之間,所以減去1就是加上255。

比如:
8位的數值共有256個狀態
16位的數值共有65536個狀態
32位的數值共有4294967296個狀態

如何求出-1在8位的數值中的二進位制形式?

   256 + (-1)

= 255

= 1111 1111

如何求出-1在16位的數值中的二進位制形式?

   65536 + (-1)

= 65535

= 1111 1111 1111 1111

如何求出-1在32位的數值中的二進位制形式?

   4294967296 + (-1)

= 4294967295

= 1111 1111 1111 1111 1111 1111 1111 1111

如何求出-2在8位的數值中的二進位制形式?

   256 + (-2)

= 254

= 1111 1110

如何求出-8在8位的數值中的二進位制形式?

   256 + (-8)

= 248

= 1111 1000

可能看到這裡,有的人已經發現了,筆者的思路是將通過原碼求反碼,再通過反碼求補碼的步驟合成一步了

在這裡插入圖片描述
正數的原碼、反碼、補碼一致
負數的原碼的符號位為1,資料位與其絕對值的資料位一致
將負數的原碼的符號位不變,資料位取反即可得到負數的反碼
最後將負數的反碼的符號位不變,資料位加1即可得到負數的補碼

比如說-1

它的原碼為

1000 0001

將其原碼的符號位不變,資料位取反,得到反碼

1111 1110

最後將其反碼的符號位不變,資料位加1,得到補碼

1111 1111

其中得到反碼的步驟中的資料位取反,可以看做用111 1111減去資料位

   111 1111
 - 000 0001

也就是127 - 1

然後得到補碼的步驟中的資料位加1,可以看做加上000 0001

   111 1111
 - 000 0001

 +000 0001

也就是

   1000 0000
 - 0000 0001

也就是128 - 1

最後得到反碼和得到補碼的步驟中都包含的符號位不變,也就是需要加上符號位, 可以看做加上1000 0000

   1000 0000
 - 0000 0001

 + 1000 0000

也就是

   1 0000 0000
 - 0 0000 0001

也就是256 - 1

所以-1的二進位制形式與一個位元組無符號形式下255的二進位制數值一致

結尾

筆者才疏學淺,慌忙之下難免有遺漏或是疏忽,如有錯誤之處,還望各位看官不吝賜教,筆者在此感謝。

作者:Fatman

部落格園地址: herf="https://www.cnblogs.com/liujingjiu">https://www.cnblogs.com/liujingjiu

CSDN地址: herf="https://blog.csdn.net/qq_35508835">https://blog.csdn.net/qq_35508835

版權歸 herf="https://www.cnblogs.com/liujingjiu">Fatman所有,歡迎保留原文連結進行轉載:)

相關文章