無符號數 有符號數 與 補碼

無符號數 有符號數 與 補碼

本文是深入理解計算機系統這本書裏面關於補碼有符號數無符號數章節的一個摘要和讀書報告,我個人認爲這本書關於這一段的表述,要比絕大多數網上的博客甚至是國內教材要深入淺出的多.同時由於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語言對同時包含有符號和無符號數表達式的這種處理方式,出現了一些奇特的行爲。當執行一個運算時,如果它的一個運算數是有符號的而另一個是無符號的,那麼C語言會隱式地將有符號參數強制類型轉換爲無符號數,並假設這兩個數都是非負的,來執行這個運算。就像我們將要看到的,這種方法對於標準的算術運算來說並無多大差異,但是對於像<和>這樣的關係運算符來說,它會導致非直觀的結果。圖2-19展示了一些關表達式的示例以及它們得到的求值結果,這裏假設數據類型int表示爲32位補碼。考慮比較式-1<0U。因爲第二個運算數是無符號的,第一個運算數就會被隱式地轉換爲無符
慮比較式-1<0U。因爲第二個運算數是無符號的,第一個運算數就會被隱式地轉換爲無符號數,因此表達式就等價於4294967295U<0u(回想T2U2(-1)=UMax),這個答案顯然是錯的。

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章