天天看點

《好學的C++程式設計》——1.1 計算機怎樣計數

本節書摘來自異步社群出版社《好學的c++程式設計》一書中的第1章,第1.1節,作者: 張祖浩 , 沈天晴,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

好學的c++程式設計

我們知道,乒乓球球場上的計分牌有0、1、2、3、4、5、6、7、8和9,共10種牌。計分時,逢十進一,叫做十進制。平常我們用的就是。

我們設想,如果計分牌不是10種,而是0和1兩種牌。那該怎麼計分呢?那隻能逢二進一了,這叫作“二進制”。計算機内部用的是二進制。

我們再設想,如果計分牌有0、1、2、3、4、5、6、7、8、9、a、b、c、d、e和f,共16種牌,其中a、b、c、d、e依次代表10、11、12、13、14和15。計分時,逢十六進一,這叫作十六進制。

3種方法的計分情況,見表1-1。從表中可看出,4位二進制數相當于1位十六進制數,它倆一個個互相對應。計分至15時,二進制1111與十六進制f相對應。此時,如果各再增1分,則二者都同時向高位進位,分别進位成為10000和10。這進位的1分是頂十進制16分的。

《好學的C++程式設計》——1.1 計算機怎樣計數

如果用二進制計分牌計分和進位,最後的得分為11101101101101,則表示十進制是多少分呢?我們可從右至左,每4位用一空格隔開,得:0011 1011 0110 1101,分别寫出它們所對應的十六進制數得:3 b 6 d。

3b6d是4位十六進制數。此數的每一位滿16都要向高位進位。最低位的1分頂1分;高1位則是1分頂16分;高兩位則1分頂16×16分;高3位則1分頂16×16×16分……可按此規律,計算得分如下:

十六進制數3 b 6 d = 3×16×16×16 + b×16×16 + 6×16 + d

=12288+11×16×16+96+13=15213(此即十進制得分)

将表1-1中4位二進制數的全部16個數圍成一圈,如圖1.1所示。我們設想,在圖中a點處把圓周剪開,然後把圓周拉直,豎立起來如圖1.2所示。在此圖中表示了與十進制數0~15相對應的全正數的4位二進制數。那麼,要表明負數怎麼辦?

如果我們在圖1.1中的b點處把圓周剪開,然後把圓周拉直,豎立起來如圖1.3所示。此圖的上半部0000~0111表示了十進制的正數0~7,下半部1000~1111則表示了十進制的負數−8~−1。這樣看來,對于有正負的二進制數,其最高位為0者為正數,最高位為1者為負數。從最高位就能判别數的正負,是以,對于有正負的二進制數,其最高位就被稱之為符号位。符号位如圖1.3中所示。

《好學的C++程式設計》——1.1 計算機怎樣計數
《好學的C++程式設計》——1.1 計算機怎樣計數
《好學的C++程式設計》——1.1 計算機怎樣計數

圖1.3 有正負4位二進制數

讀者會問,圖1.3中,0000以下的數分明比上半部的數更大,為何反說是負數呢?我們可認為,這些數個個都背了一筆巨債10000(二進制)。是以它們不是“富翁”,而是“負翁”。比如,拿負翁1011來說,負多少?觀察可知,若支援它0101,則與1011相加就是10000,就可還清債務啦。可見負翁1011實際是負0101,即負5(十進制)。可見,要問負翁負多少,就看它要還清巨債還差多少。差多少就說明它負多少。

事實上,負數應該是比0000小的數,比如負5,應該由0000-0101計算而得。

《好學的C++程式設計》——1.1 計算機怎樣計數

但不好減而向高位借位,算式變為10000-0101,算得結果為1011。因借位而成為“負翁”。

綜上可見,4位二進制數可表示全正數範圍為0000~1111,即0~15;正負數範圍為1000~0111,即−8~7。對更多位二進制數可作類似分析。比如,8位二進制數全正數範圍為00000000~11111111,即0~255;正負數範圍為10000000~01111111,即−128~127。

計算機内部用二進制表示各種資料,每8位二進制數稱為一個位元組。計算機資料存儲在記憶體中,記憶體由一個個記憶體單元組成。一個記憶體單元可存儲一個位元組,即8位二進制數。

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。

繼續閱讀