整數的表示其實是比較簡單的,無非是解決符號位、數字表示的唯一性等問題。
整數在計算機中是使用補碼表示的,在講解補碼前,先看一下相關概念。
數值在計算機中的表現形式叫做機器數,該數值就是機器數代表的真值。機器數是真值在計算機中的表現形式,真值是機器數的代表的數值。
比如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運算器的設計。
原文傳送門:
計算機系統基礎摘記 整數在計算機中的表示
2 整數在計算機中的表示 參考文獻 計算機是使用二進位制來表示資訊,因為對於電路來說,表示1和0兩個狀態是非常容易實現的。若要使用二進位制來表示數值,則需要規定二進位制對數值進行編碼的規則,不同編碼規則下,同一串二進位制表示的數值可能不同。下面介紹幾種常見的整數編碼方式。原碼最容易理解,對於有符號數...
負數在計算機中的表示
今天,老大讓我調查乙個浮點數轉換為整數的問題。自己就查了些資料,順便複習一下原碼 反碼和補碼。原碼 將乙個整數,轉換成二進位制,就是其原碼。如單位元組的5的原碼為 0000 0101 5的原碼為1000 0101。反碼 正數的反碼就是其原碼 負數的反碼是將原碼中,除符號位以外,每一位取反。如單位元組...
負數在計算機中的表示
原碼 將乙個整數,轉換成二進位制,就是其原碼。如單位元組的5的原碼為 0000 0101 5的原碼為1000 0101。反碼 正數的反碼就是其原碼 負數的反碼是將原碼中,除符號位以外,每一位取反。如單位元組的5的反碼為 0000 0101 5的原碼為1111 1010。補碼 正數的補碼就是其原碼 負...