1. 程式人生 > >整數在計算機裏的表示

整數在計算機裏的表示

種類 講解 唯一性 邏輯 連續 blog 轉換 絕對值 有符號

整數的表示其實是比較簡單的,無非是解決符號位、數字表示的唯一性等問題

整數在計算機中是使用補碼表示的,在講解補碼前,先看一下相關概念。

機器數與真值

數值在計算機中的表現形式叫做機器數,該數值就是機器數代表的真值。機器數是真值在計算機中的表現形式,真值是機器數的代表的數值。

比如5在計算機中的表現形式是00000101,所以00000101就是5的機器數,5就是機器數00000101所代表的真值。

整型數在計算機中的編碼方式

C語言中的整型數分為有符號數和無符號數兩種類型,無符號數代表的都是非負整數,所以在計算機中直接用二進制值表示就可以,但是有符號數既可以表示正整數,也可以表示負整數,所以有符號數在計算機中不能直接用二進制值來表示,需要使用補碼的方式來表示。

有符號數在計算機中的編碼方式

編碼方式是為了解決有符號數在計算機中的表示方式。計算機中的編碼方式主要有原碼,反碼,補碼三種方式。

原碼

假定機器字長4字節,原碼的編碼方式規定如下:

最高位是符號位,用0代表正數,用1代表負數,其它位就是真值的絕對值對應的二進制值,比如十進制數5的二進制值是101,又因為5是正數,所以最高位是0,其它位是0000000 00000000 00000000 00000101,完整格式如下:00000000 00000000 00000000 00000101。

上面描述了正數的原碼,下面我們看一下負數的原碼,比如-5,因為它是負數,所以最高位用1表示,又因為-5的絕對值是5,所以它的絕對值是101,因為它的原碼是10000000 00000000 00000000 00000101。但是原碼有兩個問題,一個是0有兩種表示方式,這不符合數學習慣,另一個問題是[5]原+[-5]原=[10000000 00000000 00000000 00001010]原=-10!=0,所以使用原碼無法實現正負數的加法運算,也就是說不能實現5-5=0。

反碼

為了解決原碼中兩個正負數相加不等於0的問題,人們設計了反碼,反碼的規定如下:

正數的反碼就是原碼,負數的反碼最高位是符號位,其它位是它所對應的原碼除符號位之外,其它位全部取反。就是原碼中除符號位外,0變1,1變0。比如5的原碼是00000000 00000000 00000000 00000101,因為5是正數,所以它的反碼和原碼一樣。再比如-5的原碼是10000000 00000000 00000000 00000101,因為它是負數,所以除了符號位,其它全部取反,所以它的反碼是11111111 11111111 11111111 11111010,所以5-5=[00000000 00000000 00000000 00000101]反+[11111111 11111111 11111111 11111010]反=[11111111 11111111 11111111 11111111]反 = -0,因為0無所謂正負,所以它代表的就是0,所以反碼解決了原碼相對數相加不等於0的問題,但是,0分為正0和負0不符合數學習慣,所以人們繼續改進,發明了補碼。

補碼

正數的補碼和原碼、反碼一樣,負數的補碼為它的反碼加1,所以5-5=5+(-5)=[00000000 00000000 00000000 00000101]反+[11111111 11111111 11111111 11111010]反= 00000000 00000000 00000000 00000101]補+[11111111 11111111 11111111 11111011]補= [00000000 00000000 00000000 00000000]補=0,所以補碼解決了正負數相加不等於0的問題,又因為-0的反碼加1和+0的補碼一樣,所以在補碼中,0只有一個,就是[00000000 00000000 00000000 00000000]補,因此,在計算機中有符號數采用補碼表示。

補碼的數學原理

假設在計算機中用一個字節來表示整數,那麽總共可以表示256個整數,如果這些數都是無符號數,那麽表示範圍是0~255。所以如果是兩個無符號數相加,CPU設計就會非常容易,直接對這兩個數做二進制運算就可以,但是,有符號數怎麽辦,因為有符號數涉及符號位的表示,減法的運算,所以如果用正常的邏輯思路去設計CPU的運算器,就需要解決符號位和減法運算的問題,這樣CPU的設計就會非常麻煩,而且效率也不高,因此,有人想到了同余數的概念,同余數告訴我們在有限的連續變化空間內,一個二進制數代表的不僅是這一個數,而是與這個值同余的所有整數,比如11111111這個數既可以表示255,也可以表示-1,為什麽呢?因為在1個字節存儲空間的情況下,-1和255模256相等。又因為同余數的兩個性質,一個是數a本身就是自己的同余數,另一個就是如果兩個數a和b對m同余,並且c和d也是對m同余,那麽,a+c和b+d對m同余。同余的本質就是說這些數對應的位置相同,因此,兩個數a和b的減法,就可以表示成a和(-b)對m的補碼的加法,

並且它們對應的結果一樣,這樣就可以將有符號的減法運算轉換為無符號的加法運算。下面,我們再具體論證一下,為什麽它們的結果相等?因為a和自己是同余數,所以a和a對256同余,又因為-b和-b的補碼對256同余,所以a-b和a+(-b的補碼)對256同余,又因為同余代表的是同一個位置,所以a-b的結果與a+(-b的補碼)的結果一樣,因此,補碼利用同余數的原理將有符號的減法轉換為無符號的加法,從而簡化了CPU運算器的設計。

原文傳送門:請點擊

整數在計算機裏的表示