首頁 > 後端開發 > C++ > 主體

在現代計算機中表示和操作資訊 - 第 2 部分

Linda Hamilton
發布: 2024-11-22 14:18:40
原創
731 人瀏覽過

Representing and Manipulating Information in modern computer - Part 2

第 1 部分的連結

尋址和位元組順序

32 位元機器中的 4 位元組 int 將其所有 4 個位元組儲存在連續的位元組序列中。根據機器的不同,它可以以兩種方式存儲,即小端和大端。不詳細討論Little endian儲存一個十六進位值0x01234567的int(32位元為4位元組),如下圖所示(假設起始位址為0x100):
地址/值
0x100 67
0x101 45
0x102 23
0x103 01
類似地,大端位元組序將如下所示:
地址/值
0x100 01
0x101 23
0x102 45
0x103 67
我希望您能看到順序上的差異。 Linux 32 位元、Windows、Linux 64 位元遵循 Little endian,而 SunOS/SPARC 則遵循 Big endian。

這很重要,因為透過網路從 Little endian 位元組排序機向 Big endian 位元組排序機發送訊息時可能會出現問題,反之亦然。大多數程式設計師並不認為這是一個問題,因為網頁應用程式的編寫方式可以為我們進行此轉換,但如果您正在編寫網頁應用程序,則可能需要考慮這一點。

整數算術

您可能會驚訝地發現,兩個正數相加會得到負數,並且 x

讓我舉個例子,假設我們有一台計算機將 int 儲存為 4 位,並且我們有兩個 無符號 int x 和 y。

無符號整數 x = 10; // 二進位表示:1010
無符號整數 y = 15; // 二進位表示:1111
無符號整數 z = x y; // ???

z 的值為 25,對嗎?對嗎?

嗯,不。如果將 25 轉換為其二進位表示形式,則結果為 11001,但正如我所提到的,我們的電腦只能儲存 4 位元整數(無符號情況下的值從 0 到 15)。那麼,我們的電腦將如何處理額外的 1 位元呢?你是對的,它會丟棄高位(左起第一位),我們將得到 1001,它轉換為 9。這與使用 16 進行模組相同,即 25 mod 16=9。計算機的這種不限於算術的行為也稱為溢出。

但是為什麼我在這裡使用 unsigned int 呢?對於有符號整數,此加法的行為是否會有所不同?

答案:是的,但在解釋結果是什麼以及我們的計算機如何最終得到這個結果之前,讓我們先了解一下我們的 4 位大小整數有符號和無符號有何不同。

有符號整數

它們可以儲存從-8(bin代表:1000)到7(bin代表:0111)的正負兩個數字值。高階位(左起第一位)給出有符號整數負值,其餘位則給出正值。因此,要獲得最小的數字,我們需要將高位翻轉為 1,其他位元翻轉為 0;要獲得最大的數字,我們需要將高位翻轉為 0,其他位元翻轉為 1。

無符號整數

它們只能儲存從 0(二進位表示:0000)到 15(二進位表示:1111)的正數值。

現在,因為 x=10 和 y=15 在相加之前會溢出,所以我們將使用更小的值:
整數x = 5; // 0101
整數y=6; // 0110
int z = x y // ???

如果我們忽略帶符號的考慮,二進位表示應該是 1011。如你所看到的,高位被翻轉為 1,從上方看,z 的值將是 -5(= -1*2ˆ3 2ˆ1 2ˆ0) 而不是 11。

而且,增加兩個負數可能會導致結果。例如,
int x = -8 // 1000
int y = -5 // 0101
int z = x y // ???

現在z 將為-13,即二進位的10011(高階位元用於負數,即-1*2ˆ4 = -16),但我們的電腦只能儲存4 位,因此它將丟棄高階位,變為0011,即十進制3。再次溢出。

這就是為什麼 x

這就是今天的全部內容。如果這裡的某些資訊是錯誤或缺失的,請評論。謝謝。

以上是在現代計算機中表示和操作資訊 - 第 2 部分的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板