十進位制與二進位制互相轉換指南

2021-08-14 13:34:02 字數 2656 閱讀 1401

電腦科學概論最近在學這個。費了大概一星期的課餘時間來弄懂正負數、整數浮點、小數分數的互相轉換。寫出來,方便以後複習用。

與十進位制的滿十進一一樣,二進位制是滿二進一的。所以用二進位制表示的數與十進位制存在如下關係(以8位為例)(為了便於排版,用了豎排):

1 -> 128 = 27

1 -> 64 = 26

1 -> 32 = 25

1 -> 16 = 24

1 -> 8 = 23

1 -> 4 = 22

1 -> 2 = 21

1 -> 1 = 20

往上,以此類推。因此,只要用2的n次方乘以對應位的數字就行。

舉例:01001011(2)=0×27+1×26+0×25+0×24+1×23+0×22+1×21+1×20=75(10)

這是我高中學的方法,也算是最笨的方法:使用短除法求餘。將數值一直除以2,直到商為0。第乙個取出來的餘數是最靠近小數點的。

舉例:125

然後從下往上讀,得到1111101。即125(10)=1111101(2)。

使用速算的方法。(大概是公升級版?)

由二進位制轉十進位制的方法可以推出該方法。記住低四位是8、4、2、1即可,其餘的可以往上推出 舉例:75 速算,得出75 = 64+16+4+1。與對應位的數字比較,得到75(10)=01001011(2)。

二進位制滿二進一。因此以二進位制進行四則運算時存在如下規律:

0+0=0, 0+1=1, 1+0=1, 1+1=10. 0×0=0,

0×1=0, 1×0=0, 1×1=1.

明確一點:負整數在計算機中是以二進位制補碼(two』 s complement)的形式儲存的。為講解方便,下面的位長度均為4.

在負數的儲存中,最左邊的一位是符號位,負數的符號位為0,正數的符號位為1。因此,在位長度為4的條件下,3(10)=0011(2),-3(10)=1101(2)。

十進位制數求補碼的方式

先將十進位制數轉換為二進位制數,然後全部取反,最後將所得的數+1; 例:-6 寫出6的二進位制表示:0110; 全部取反:1001;

+1:1010

同樣先寫出二進位制數,然後從右往左,將所有位的數字照抄下來,直到遇到第乙個1為止,最後將這個1前所有位數取反。

例:-6

寫出6的二進位制表示:0110;

1前所有數字取反:10

合併:1010

推薦第一種方法,不容易算錯。

先看符號位,0為正數,1為負數。如果符號位是0,直接轉成十進位制數;如果符號位為1,將所有位取反然後+1;或從右往左照抄所有數字,直到遇到第乙個1,然後將1前所有位數取反,最後轉成十進位制數。

溢位(overflow)是指在算數計算中,得出的數值大於系統能表示的最大值或小於最小值的情況。溢位會造成錯誤,有可能給計算機造成損害。

舉例說明。前面將位長度設為4,這樣的話計算機只能儲存從-8到7的整數。一旦我們計算的結果超過這個範圍,就會引發錯誤。如6+4,你以為答案是10,但計算機給出的結果是-6。原因很簡單,把6和4轉成二進位制再運算下:

0110+0100=1010=-6(10)

不過現在的計算機使用的位數比例子中的長得多,所以小數的運算大可不必擔心。

移碼的計算方法很簡單,將補碼的符號位取反即可。

如無說明,位長度均為8位。

儲存小數時,一般第1位為符號位;第2~4位為指數字(使用移碼編碼);第5~8位為尾數字。

十進位制與二進位制在小數點後的關係如下:

1 -> 1 = 20

1 -> 1/2 = 2-1

1 -> 1/4 = 2-2

1 -> 1/8 = 2-3

如此類推。

首先看符號位,0為正,1為負。接著看指數字,將指數字的數轉為補碼再判斷正負、代表的十進位制數是多少。最後看尾數字,按指數字的數字移動小數點(正往右,負往左),轉成十進位制數的最終結果。

例:01101011。

符號位為0,代表這個數是正數。指數字為110,轉成補碼為010,說明指數字的數字是2,之後處理小數點時要把小數點右移兩位。尾數字的數為1011,依照指數字的數移動後,數字變為10.11,轉成十進位制為2 3/4。

例2:00111100

符號位為0,代表這個數是正數。指數字為011,轉成補碼為111,說明指數字的數字是-1,小數點要左移一位。尾數字的數為1100,小數點移動後數字變為0.0011,轉成十進位制為3/8。

先看符號位,0為正數,1為負數。接著將十進位制數直接轉成二進位制數。再將小數點移動至所有數字前面,計算移動的位數和方向,然後轉成補碼,最後合併,得到結果。

思考一下這個數字的轉換:3 3/8。如果依舊用8位的位長度,轉換成二進位制後,這個數是這樣的:01101101。

似乎**不對。再轉回十進位制看看。

尾數字是1101,小數點右移兩位變為11.01,轉成十進位制是3 1/4。嗯?還有1/8去哪了?

這種位數丟失的情況就叫截斷(truncation)。

還有一種情況。假設程式要儲存1/3,而根據十進位制與二進位制的關係,計算機中只有1/2、1/4、1/8…因此計算機是不可能精確地儲存這個數的,只能儲存乙個近似值。這也是截斷錯誤的一種。

說好的方便複習,結果在期末考試前一晚才寫出來……

有錯請指出。

感謝**。

二進位制 十進位制 十六進製制互相轉換

今天看書講到十進位制 二進位制 十六進製制的互相轉換,自己試了下。十進位制和十六進製制互相轉換需要借助二進位製作為中間媒介。用到了stl標準庫的向量 佇列 字串。decimal2hex2decimal.cpp 定義控制台應用程式的入口點。include stdafx.h include includ...

十進位制二進位制轉換

一 整形裝換成兩個位元組 int value 456 unsigned char byte1 value 0xff00 8 高8位 unsigned char byte2 value 0xff 低8位 nslog byte1 x byte2 x byte1,byte2 byte1 1 byte2 c...

十進位制二進位制轉換

1.十進位制轉二進位制 正整數轉二進位制 除二取餘,然後倒序排列,高位補零 負整數轉二進位制 先是將對應的正整數轉換成二進位制後,對二進位製取反,然後對結果再加一。小數轉換二進位制 對小數點以後的數乘以2,取結果的整數部分 不是1就是0嘍 然後再用小數部分再乘以2,再取結果的整數部分 以此類推,直到...