有符号二进制数--补码
link
1.計算機內,有符號數的3種表示方法:原碼,反碼,補碼。
?
(1)最高位為符號位,“0”為正,“1”為負,其余位為數值大小。
?
(2)反碼:正數??? 反碼? = 原碼;
??????????????????????? 負數??? 反碼? = {符號位不變}且{數值位按位取反}
?
下面重點說一下補碼!
?
2.整數的補碼:
?
(1)正數的補碼 = 原碼;
?
(2)負數的補碼 = {原碼符號位不變} 且 {數值位按位取反+1}
?
???????????? or = {原碼符號位不變} 且 {數值位從右邊數第一個1及其右邊的0保持不變,左邊按位取反}
?
(3)舉例:以十進制數+99和-99為例:(符號位0為正數,1為負數)
?
?????????? +99?原碼 = 0110_0011 b
?????????? +99?補碼 = 0110_0011 b
?
??????????? -99?原碼 = 1110_0011 b
??????????? -99?補碼 = 1001_1101 b
?
注意:(a)0的補碼只有一個:
??????????????????????
????????????????????? +0 原碼 = 0000_0000 b,-0 原碼 = 1000_0000 b
????????????????????? +0 反碼 = 0000_0000 b,-0 反碼 = 1111_1111 b
????????????????????? +0 補碼 = 0000_0000 b,-0 補碼 = 0000_0000 b? -- 相同,均為0000_0000 b
?????????
?????????????? (b)8位二進制數的表示范圍:
????????????????????????????
???????????????????????? 8位原碼:??????????? -127 d -- +127 d
???????????????????? 1111_1111 b --? 0111_1111 b?
??
???????????????????????? 8位反碼:??????????? -127 d -- +127 d
???????????????????? 1000_0000 b --? 0111_1111 b
?
???????????????????????? 8位補碼:??????????? -128 d -- +127 d
???????????????????? 1000_0000 b --? 0111_1111 b
?
??
?
3.純小數的原碼:小數點前一位為符號位,若為正,則后面數值位不變;
??????????????????????????????????????????????????????????????????????????????????若為負,則后面數值位取反加1。
????????????????????????????????
???? 例子:0.9239 d 原碼 = 0.1110_1100_1000_0100
???????????????????????????????????補碼 = 0.1110_1100_1000_0100
?
???????????????? -0.9239 d 原碼 = 1.1110_1100_1000_0100
???????????????????????????????????補碼 = 1.0001_0011_0111_1100
?
4.一般在硬件語言中使用二進制補碼時,是不可能帶有小數點的,而且一個數通常有正數和小數兩部分,這種情況下最好的方法是先將該數轉換為正數,再進行轉換會。
?
例子:??? -87.36????原碼 = 1101_0111 . 0101_1100_0010_1000
?
求其補碼,計算過程如下:
?
先用 -87.36 * 2^16 = -5725224 d = 1101_0111_0101_1100_0010_1000 b
此時再取反加1,則補碼 = ?1010_1000_1010_0011_1101_1000 b,
最后再除2^16,恢復小數點的位置即可。
?
?
?
?
總結
以上是生活随笔為你收集整理的有符号二进制数--补码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用面包板做一个cpu
- 下一篇: 为什么 在内存中为什么 0xffff 是