機器數:
在機器中,用二進位制表示有符號數,用最高位表示符號,其餘的為數值位,這樣一組連同符號也編碼化的二進位制數稱為機器數。
(符號位
0為正,
1為負)
真值:機器數所代表的數值大小稱為機器數的真值(
即實際的值,有正負,例如
1000 0001的真值
為= –000 0001 = –1
,1000 0001即為機器數
)。在機器數中最高位為符號位,符號位為0
表示正數,符號位為
1表示負數
,其餘為該數的絕對值,這種表示方法 就稱為原碼。
例如:8位二進位制原碼表示數的範圍是
-127
到+127
,即-2^7-1
到2^7-1
,最高位為符號位
0的原碼有兩種表示方法,即+0和
-0,設字長為8位
【+0】原
= 0000 0000b
【-0】原
=1000 0000b
採用原碼表示法時,編碼簡單直觀,與真值轉換方便,便於人識別,但也帶來一些麻煩
一:是引起機器中零的表示不唯一,零有二義性,給機器判零帶來麻煩,必須在設計時約定好機器採用正零或負零
二:是不便於進行加減運算,用原碼進行四則運算時,符號位需單獨處理,而且原碼加減運算規則複雜。
n位二進位制原碼的表示範圍為
-(2-1)到
+(2-1)
正數的反碼與原碼相同。
負數的反碼等於原碼除符號位外,其餘各位按位取反。即符號位依舊是0正1
負,其餘的取反
例如:
0的反碼也有兩種表示方法,即+0和
-0,設字長為8位
【+0】原
= 0000 0000b
(與原碼相同)
【-0】原
=1111 1111b
(符號位相同,其餘取反)
n位二進位制反碼的表示範圍為
-(2-1)到
+(2-1)
正數的補碼表示與原碼相同,即【x】補=
【x】原=
【x】反負數的補碼等於它的反碼加1
,即在其反碼的最低位加
1就為該數的補碼
例如:0的補碼只有一種就是
0000 0000
,無論+0
或者-0
,在補碼中也應沒有
-0的概念
而原可表示-0
的1000 0000
則表示為
-128
,則可多表示乙個數,所以位於4位
int型,
可以表示範圍是: [-231,
231-1]
n位二進位制補碼的表示範圍為
-2到+(2
-1)也即正數以原碼儲存,負數以補碼儲存,符號位0為正1
為負,0
的儲存形式只有+0為
0000 0000
,沒有-0
,1000 0000
表示-128
,為2^(n-1)
首先對於原碼,人眼可很快根據最高位識別出乙個數的正負且進行正確的加減運算,例如乙個正數加上乙個負數,我們能很快辨別出是等於這個正數減去負數的絕對值,但對於計算機,為設計簡單,在計算機中只有加法器,沒有減法器,cpu
只會做加法
,若用2
個原碼或反碼進行相應加法則運算會發生錯誤,所以由相應的規定人為可以很輕鬆看出真值的原碼,到規定計算機原碼到補碼轉化過程中的反碼,再到最後規定了可只用加法器就能進行正確運算的補碼,
所以計算機中的所有數都是補碼形式進行儲存!(基本可以這樣認為,負數用補碼表示,正數的原碼等於補碼)
總之採用補碼可用加法的運算代替減法運算,從而可以簡化硬體結構,降低成本!
形象的可解釋為在日常生活中,如鐘錶系統,若當前世界為10
點,我想將時間調回
8點,第一種方法是往回調即逆時針旋轉
2小時、旋轉
14小時、旋轉
26小時。。。。。
第二種方法是往前撥即順時針旋轉10
小時、旋轉
22小時、旋轉
34小時。。。。。
若順時針撥為正,逆時針為負則用數字表示即調時間方法為:
10時-2時=8
時 10
時+10
時=20時=8
時 也即
10-2=8 10+10=8
很巧妙的將10減2
變成了加
10,因為時針是圓的,時針一圈為
12小時,上午
8點與晚上
20點在時針上的位置是一樣的,因為他們相差
12小時
,20點減去乙個週期
12小時即得到了8點
這在數學上稱其為共模同餘,其中12
稱為時針技術系統的模,也即
10-2=10+10
(mod 12
) 計算機也正是用這以數學思想,巧妙的將原來本是減法運算轉換成可進行正確的加法運算
也就是說假設是在當模為12
時,我們需要計算機進行
10-2
的運算,計算機將
10存為補碼10,
-2存為補碼
10,然後進行相加,所得的結果為
20,由於超過了位碼,捨去了計數器的乙個最高位也即模的大小,即
12,剩下位數為8,
8依舊為補碼,再轉換成原碼輸出給我們,為8(
不過計算機採用的模不是12
,而是2
!)對於字長為n
位的二進位制計數系統,某乙個數x,
其絕對值小於模數|x|<2
,補碼定義如下:
【x】補
=2+x
若x為正數,即0《
x<2
-1,則【x】補
=2+x=x,因為計數器加上
2,超過位數,自然丟失這一位,等於沒加,見後例
若x為負數,即
-2《x《0
,則【x
】補=2
+x=2
-|x|,即該數補碼為模減去該負數的絕對值(這也形象說明計算機採用的是共模同餘的這種數學思想,雖然計算機無法進行
2-|x|這種減法運算,不過計算機能夠判斷符號位是0還是
1,以及將1變成
0,0變成
1,也能進行加
1操作,進行這些操作也即是負數的補碼是等於它的反碼加1)
通過這樣定義的補碼儲存在計算機當中,當進行運算時若有超過模的部分位數會被自然丟失,剩下位數所得結果再轉換成相應的原碼即為正確運算結果
例:計算64-10=
?在字長為8
為的二進位制計數器系統中
64的補碼為:
0 100 0000b
-10的原碼為:
1 000 1010b
-10的反碼為:
1 111 0101b
-10的補碼為:
1 111 0110b
然後將2
數的補碼相加:
0100 0000=【
+64】補
+ 1111 0110=【
-10】補
1 0011 0110=【
+54】補
1由於為
8位系統,被自然丟失!
0011 0110
表示的補碼原碼也為
0011 0110
,即表示
+54,也與事實相符
機器數 原碼 反碼 補碼
原碼是什麼?原碼就是早期用來表示數字的一種方式 乙個正數,轉換為二進位制位就是這個正數的原碼。負數的絕對值轉換成二進位制位然後在高位補1就是這個負數的原碼 舉例說明 int型別的 3 的原碼是 11b b表示二進位制位 在32位機器上佔四個位元組,那麼高位補零就得 00000000 00000000...
機器數之原碼 反碼 補碼
前言 規定將乙個二進位制數的最高位作為符號位,用0表示正,用1表示負。機器數 在機器內部存放的正負號數碼後的數。真值 在機器外部存放的由正負號表示的數。一 原碼 表示方法 符號位 用0表示正,用1表示負。特點 數值部分與該二進位制真值的數值部分相同。注意 1 0的原碼有兩種形式,0的原碼為00000...
原碼 反碼 補碼
正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...