第 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中文網其他相關文章!