問:現在的時間是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所有,歡迎保留原文連結進行轉載:)