無符號數 有符號數 與 補碼

2021-08-29 04:13:01 字數 2568 閱讀 6925

本文是深入理解計算機系統這本書裡面關於補碼有符號數無符號數章節的乙個摘要和讀書報告,我個人認為這本書關於這一段的表述,要比絕大多數網上的部落格甚至是國內教材要深入淺出的多.同時由於markdown的文件表示公式很麻煩,本文將大量使用書中的截圖作為公式使用.

書中採用乙個函式b2u w(binary to unsign ,二進位制向量長度為w)將乙個二進位制向量轉化為無符號數.

我們現在給出定義

要注意上面的這個函式,他是雙射的,也就是說無符號數的編碼是唯一的.當然大前提是在w即長度是固定的情況下.

在無符號數中,最小值是0,最大值

在補碼定義中最關鍵的是最高位被解釋為負權,也就是說當他是1的時候,這個數就是負數了.同樣的我們也引用b2t w(binary to two』s-complement,二進位制向量長度為w)作為函式來定義.

對於補碼而言,他也是雙射的.當然這裡我就不給出證明了.

他的最小值是位向量[1…0],

而最大值,這是[01…1]

在這裡我們可以看到補碼的不對稱性,即|tmix w| = |tmax w| + 1.這一點會造成補碼運算的某些特性,並對於電腦程式造成特殊的bug.

最大的無符號數剛好是補碼最大值的的兩倍還大一.即umax w = 2tmax w + 1.

有趣的是c語言並沒有定義一定要使用補碼表示有符號數,然而幾乎所有的現代機器都是用補碼.

原碼表示法在數值前面增加了一位符號位(即最高位為符號位):正數該位為0,負數該位為1(0有兩種表示:+0和-0),其餘位表示數值的大小.我們使用函式b2s w(binary to sign-magnitude)來定義

反碼(one』s complement)也同樣適用符號位.正數的反碼與其原碼相同,負數的反碼是對其原碼逐位取反.我們也使用函式b2o w來定義

對於反碼我們可以得到他的最大最小值剛好是共軛的.最大值是(2的 w-1次冪 -1) 最小值是(負的2的 w-1次冪 -1)

在某些教材中習慣於先從原碼反碼開始說起,在引入補碼,這是因為為了讓學生有跟直觀的了解.因為補碼的計算是不直觀的,引入原碼和反碼之後計算補碼會直觀的多.

正整數的補碼是其二進位制表示,與原碼相同.

求負整數的補碼,將其對應正數二進位制表示所有位取反(包括符號位,0變1,1變0)後加1(但是不允許影響符號位).i

上述的表述雖然是不嚴謹的,沒有計算機數學應該有的嚴謹性,卻是非常直觀的.

不過在由於在計算機歷史上還沒有直接使用原碼的機器(但是卻用原碼來表述浮點數),也只有少數幾種機器使用反碼,而現代的計算機基本都是使用補碼來表示有符號數.

在c語言中我們有有符號數與無符號數的強制轉化.由於二者的最大最小值是不同,為了避免出現位值不夠的情況,我們的轉化採用的是位模式不變,只改變量值的辦法.右下圖我們可知對於0xcfc7的16進製制數而言,表示為補碼-123456,又可以表示為無符號數53191,因此二者之間可以進行轉化

我們可以通過推倒得到對於補碼有符號數轉化為無符號數,我們得到兩個公式

無符號數轉化為補碼的有符號數,我們得到兩個公式

由於c語言對同時包含有符號和無符號數表示式的這種處理方式,出現了一些奇特的行為。當執行乙個運算時,如果它的乙個運算數是有符號的而另乙個是無符號的,那麼c語言會隱式地將有符號引數強制型別轉換為無符號數,並假設這兩個數都是非負的,來執行這個運算。就像我們將要看到的,這種方法對於標準的算術運算來說並無多大差異,但是對於像《和》這樣的關係運算子來說,它會導致非直觀的結果。圖2-19展示了一些關表示式的示例以及它們得到的求值結果,這裡假設資料型別int表示為32位補碼。考慮比較式-1<0u。因為第二個運算數是無符號的,第乙個運算數就會被隱式地轉換為無符

慮比較式-1<0u。因為第二個運算數是無符號的,第乙個運算數就會被隱式地轉換為無符號數,因此表示式就等價於4294967295u<0u(回想t2u2(-1)=umax),這個答案顯然是錯的。

有符號數與無符號數

關於有符號數和無符號數的一些重要知識點,包括它們在記憶體中的儲存方式 互相轉換 越界計算等。大家肯定都知道,對於有符號數,資料型別的最高位用於標示資料的符號,最高位為1表示負數,最高位為0表示正數,那麼今天我們主要就此討論乙個問題 在計算機內部具體是如何表示有符號數呢?在計算機內部是通過補碼的方式來...

位元組 字長 移位,補碼,有符號數與無符號數

位元組是最小的記憶體定址單元,乙個位元組是由8位二進位制數組成的,而二進位制數是記憶體的最小單元。字長是記憶體單元的位址的位數,每個字長指向乙個位元組,也就是c 指標中存放的位元組個數。比如32位字長的機器,虛擬位址範圍就是0 2 32 1,虛擬位址對應的是虛擬記憶體,虛擬記憶體就是乙個抽象的概念,...

無符號數與有符號數比較

2012 04 24 19 30 2555人閱讀收藏 舉報擴充套件 先出幾個題目,再解釋一下為什麼答案是那樣的。題目一 int a 1 unsigned int b 1 printf d a b 結果輸出 1 因為無符號數與有符號數比較時,要將有符號數轉化為無符號數,再來比較。a轉化為無符號數後就是...