整數的二進位制表示

2022-10-11 04:51:13 字數 1795 閱讀 2745

目錄總結

整數的二進位制表示,需要區分正整數和負整數來看。

看正整數的二進位制表示,就要先了解一下位權

十進位制、二進位制都有位權。以 123 為例:123 = 1 * 10^2 + 2 * 10^1 + 3 * 10^0。每個位置的位權都不一樣,十進位制從右到左,以 1 開始,依次乘 10 。也就是說第 1 位為 1 ,第 2 位為 10,第 3 位為 100。

那麼二進位制怎麼表示 123 呢?二進位制中,每個位置只能有兩個數字:0 和 1。位權的表示和十進位制中的相似,從右到左,以 1 開始,依次乘2。也就是說,第一位是 1,第二位是 2,第三位是 4。那麼十進位制123 用 二進位制表示就為:

0111 1011

它的表示其實是:

0111 1011 = 0 * 2^7 + 1 * 2^6 + 1 * 2^5 + 1* 2^4 + 1 * 2^3 + 0 * 2^2 + 1 ^ 2^1 + 1 * 2^0
負整數的二進位制表示,是對它對應的正整數的二進位制,進行補碼運算:

求 -123 的二進位制表示:

1. 求 123 的二進位制表示:0111 1011

2. 對 1 的結果進行補碼運算(取反加1):1000 0101,這個就是 -123

可以驗證一下 0111 1011 + 1000 0101 的結果是 0000 0000。

負整數的二進位制為什麼要用補碼表示?

因為只有這種形式,計算機才能實現正確的加減法。計算機其實只能做加法,也就說,在計算機中,1-1其實是1+(-1)。如果用原碼表示,計算結果是不對的。

符合直覺的方式表示負整數(高位變為1):

1  -->  0000 0001

-1 --> 1000 0001

-----------

-2 --> 1000 0010

1 - 1 = -2,結果不對。

使用補碼表示後:

1  -->  0000 0001

-1 --> 1111 1111

-----------

0 --> 0000 0000

1 - 1 = 0,結果正確。

整數的運算結果為什麼出現負數

理解二進位制加減法後,就可以理解正數的運算結果為什麼會出現負數:

byte a = 127;

byte b = 1;

byte c = (byte) (a + b);

// -128

system.out.println(c);

輸出為 -128,與我們預期的 128 不一致。

運算過程如下:

0111 1111  

+0000 0001

-----------

1000 0000 (byte 在記憶體中只佔 8 位,首位位 1,會被認為是負數,所以結果是 -128)

由於 byte 在記憶體中佔 8 位,首位為 1,會被認為是負數,所以輸出的結果是 -128。

整數的二進位制表示,需要區分正整數和負整數。求負整數的二進位制表示時,需要將其對應正整數的二進位制進行補碼運算。

只有進行補碼運算,才能保證二進位制加減法正確。

理解二進位制加減法後,就可以理解為什麼整數的運算結果會出現負數,計算機會將首位為 1 的二進位制數當作負數,在我們存放資料的資料結構位數不足以容納我們資料時,就可能會出現預期結果和計算結果不一致的情況。

LintCode 二進位制表示

給定乙個數將其轉換為二進位制 均用字串表示 如果這個數的小數部分不能在 32 個字元之內來精確地表示,則返回 error 樣例 n 3.72 返回 error n 3.5 返回 11.1 題目很簡單,直接上 吧 public class binaryrepresention return res.r...

LintCode 二進位制表示

給定乙個數將其轉換為二進位制 均用字串表示 如果這個數的小數部分不能在 32 個字元之內來精確地表示,則返回 error 您在真實的面試中是否遇到過這個題?yes 樣例n 3.72 返回 error n 3.5 返回 11.1 好久沒做題 有點懵逼 根據資料試出來的 臥槽 public class ...

二進位制表示 LintCode

給定乙個數將其轉換為二進位制 均用字串表示 如果這個數的小數部分不能在 32 個字元之內來精確地表示,則返回 error 樣例 n 3.72 返回 error n 3.5 返回 11.1 ifndef c180 h define c180 h include include using namesp...