資訊的表示 一

2022-09-06 10:15:08 字數 1928 閱讀 7411

現代計算機儲存和處理的資訊均以二值訊號表示。對於人來說,十進位制已經完全夠了,但對於計算機來說,二進位制會表現得更好,為什麼可以參考《從編碼到二進位制》一文。不同的數字有著不同的含義,這個含義是我們人去定義的,計算機如何理解,需要人去告訴它。對於不同的程式語言,計算機會有不同的理解方式。在此我們主要討論的是c語言在計算機中的表示,其他語言使用了類似的方式,只是存在細微差別。

大多數的計算機使用乙個位元組作為最小的定址單位,乙個位元組是由8個位組成的。我們研究三種最重要的數字表示法,分別是無符號數,補碼和浮點數。在本文中我們先討論無符號數和補碼。

對於傳統的非負數,我們可以很容易的將十進位制轉換為二進位制,只需要有足夠多的位來表示就可以了。

上述提到了傳統的非負數,那麼如果是負數怎麼辦呢?如果在前面增加乙個符號位會怎樣?例如,最開始從左到右的第一位如果是1表示負數,0則表示正數。這似乎不是乙個很好的辦法,因為這增加了額外的開銷,而且對於0,將會有+0和-0兩種情況,這將對數字處理帶來不必要的麻煩(實際上這也就是反碼)。考慮這樣乙個事實,如果在無符號數中使用0減去1會得到怎樣的結果。當然在我們看來,結果顯然是-1,但在計算機中卻得到了1111 1111 1111 1111 1111 1111 1111 1111,即32個1組成的串。因為當減出來的數是乙個負數是,原先的被減數顯然不足以被減,需要向前面借位,同時無符號數字的位數足夠多的情況下則一定以0開頭,而這也就導致乙個事實 ——負數一定以1開頭

這似乎是乙個天然的規律,可不可以使用這個規律來表示負數呢?答案是可以的。將二進位制串看成乙個位元向量,例如1111 1111可以看成\([x_, x_, x_, x_, x_, x_, x_, x_]\),w表示長度,其中每一位均為1。在無符號數的表示中,每乙個位乘上該位的權重,再加和即可得到最後的十進位製非負數結果。而在補碼中,第一位可以看作是乙個符號位,但它也是帶有權重的,這個權重是\(-x_2^\),也就是將無符號數原先該位的權重加上了負號得到的解。這樣既沒有多餘的開銷來表達負數也沒有+0和-0的區別。

將無符號數x轉換成十進位制:

\[func(\vec ) \doteq \sum \limits _ ^x_i2^i

\]將補碼x轉換成十進位制:

\[func(\vec) \doteq -x _ 2^+ \sum \limits_ ^x_i2^i

\]有了以上公式,很容易得到無符號數和補碼十進位制的轉換公式

將無符號數轉為補碼:

​ $$func(x) = x - x_2^w$$

將補碼轉為無符號數:

​ $$func(x) = x + x_2^w$$

布林運算中有與或非三種最基本情況,這放在二進位制表示數字的每乙個位上同樣適用。在c語言中,可以對乙個數字求非,對兩個數字求與和或,運算子分別是~、&、|。如果有布林代數的知識基礎在這裡會很容易理解。

有了基礎的布林運算還不太夠,因為程式中一定會設計到大量的邏輯判斷,是或者否。於是也就有了邏輯運算子&&、||、!,分別對應於命題邏輯中的and、or、not。

移位運算也就是在位的角度,將位進行左移或者是右移。在c語言中,對位執行左移,將會在右邊補上0。但對位執行右移,則存在了兩種不同的情況,分別是邏輯右移和算數右移,c語言標準並沒有明確規定使用哪種情況,但事實上幾乎所有的機器都對有符號數字使用算數右移,對無符號數字均使用邏輯右移。我們來看一下這幾種不同的情況。

操作值1

值2引數x

01100011

10010101

x << 4

00110000

01010000

x >> 4 (邏輯右移)

00000110

00001001

x >> 4 (算術右移)

00000110

11111001

資訊的表示 二

編寫c語言的 時常見的問題之一就是不同字長的整數相互轉換直接容易引發潛在的錯誤。例如低字長整數轉換為高字長整數會發生隱式位擴充套件,而高字長整數轉換為低字長整數會發生隱式位截斷。可能你會疑惑為什麼這裡只有整數而沒有浮點數,這是因為浮點數在位模式上採用了與整數不同的表示方式,這在之後會討論。在對整數進...

資訊的表示和儲存

練習文字資訊在計算機中的表示 無符號數和有符號數 數的定點表示和浮點表示 定點運算和浮點四則運算 binary二進位制 dec十進位制 oct八進位制 hex十六進製制 非十進位制轉換為十進位制 把非進製數首先寫成加權係數展開式,然後按十進位制加法規則求和。這種做法稱為 按權相加 法。十進位制轉換為...

壹 資訊的表示和處理

道生一,一生二,二生三,三生萬物。萬物始於此,此為何物?從基本資料型別開始,我們將逐漸深入了解計算機。計算機為什麼用二進位制?對於十個手指的人來說,使用十進位制是自然而然的事。但是對於機器來說,使用二進位制有什麼好處?因為二進位制更容易表示,儲存,傳輸 這就要從模擬電路講起,一言以蔽之就是,位元這種...