資料表示法:位元、位元組與數值
位元模式與其解讀
這裡是整個計算領域中最深刻、也最令人解放的觀念之一:記憶體裡的位元並不承載它們自己的意義。保存著 0100 0001 的位元組,不過是八個開/關狀態的一種模式。那個模式「是」數字 65、字母 A、某個顏色的一部分,還是一段機器指令的碎片,完全取決於某個程式決定怎麼讀它。位元是名詞;解讀是你選擇套用的動詞。
具體來說,「同樣的」32 個位元可以讀成有號 int、無號 int、四個字元的文字片段,或一個浮點數,而每一種讀法都給出截然不同的值——沒有哪個比其他的更「真」。在 C 裡,變數的「型別」正是告訴編譯器如何解讀一片位元的指示:寫 int x,這些位元就是二補數整數;寫 float x,同樣的位元模式就被解碼成符號、指數和尾數。一次型別轉換或型別雙關(type-pun)改變的是解讀,卻不動一個位元。
這就是為什麼「位元『就是』那個數」這種想法最終會誤導你。那個數只是位元的一種讀法。它解釋了為什麼重新解讀記憶體(例如把一個整數的位元當成浮點數)會產生胡言亂語,為什麼一次破壞型別資訊的失控寫入如此危險,以及為什麼誠實的心智模型永遠是:先有模式,後有意義。幾乎後面每一個觀念——二補數、IEEE-754、文字編碼、位元組序——都是把一個固定模式變成某個特定意義的規則。
32 位元模式 0x40490FDB,若按 IEEE-754 讀是浮點數 3.1415927,但若按 int32 讀則是整數 1078530011。相同的位元,兩個真相。
型別是鏡片;無論如何位元都是同一組。
在 C 裡,透過錯誤的指標把某型別的位元重新當成另一型別來讀,可能是未定義行為(嚴格別名規則);安全地重新解讀位元模式的方法是 memcpy 或 union,而不是隨便的型別轉換。
又称
另见