目錄
- 0 基礎概念及摘要
- 1 資訊存儲
- 1.1 十六進制表示法
- 1.2 字資料大小
- 1.3 尋址和位元組順序
(1) 基礎概念:
現代計算機存儲和處理的資訊以二進制信号表示 —— 0 | 1, 是非有無、非黑即白, 代表計算機是精确的.
計算機的表示法是 **用有限數量的位(bit)來對一個數字編碼, 如果數字太大難以表示時, 某些運算就會 溢出(overflow).
數字有三種表示形式:
a) 無符号(unsigned) 編碼: 表示大于或等于0的數字;
b) 補碼(two's-complement) 編碼: 表示有符号整數(可以為正或為負的數字)的最常見方式;
c) 浮點數(floating-point) 編碼: 表示實數的科學計數法的、以2為基數的版本.
整數運算和浮點數運算有不同的數學屬性 —— 他們處理數字表示有限性的方式不同:
整數的表示雖然隻能編碼一個相對較小的數值範圍, 但這種表示是精确的;
浮點數雖然可以編碼一個較大的數值範圍, 但這種表示隻是近似的.
大多數計算機使用8位(bit)的塊, 或者 位元組(byte), 作為最小的可尋址的記憶體機關, 而不是通路記憶體中單獨的位.
記憶體的每個位元組都由一個唯一的數字來辨別 —— 這個數字稱為 位址(address), 所有可能的位址的集合稱為 虛拟位址空間(virtual address space) —— 邏輯概念、概念性映像.
一個位元組由8位組成, 在二進制表示法中, 它的範圍(值域)是 00000000 ~ 11111111, 對應十進制的 0~255.
為了避免二進制表示法的冗長, 同時兼顧友善與位之間的轉換, 我們用 十六進制(hexaecimal) 來表示位模式, 一個位元組的範圍是 0x00 ~ 0xFF.
(1) 十六進制表示法:
十六進制 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
---|---|---|---|---|---|---|---|---|
十進制 | ||||||||
二進制 | 0000 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | |
8 | 9 | A | B | C | D | E | F | |
1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 | |
12 | 13 | 14 | 15 |
說明: 在C語言中, 以0x或0X開頭的數字常量被認為是十六進制的值.
字元‘A’ ~ ‘F’既可以是大寫, 也可以是小寫.
(2) 進制間的轉換:
如0x7AF轉換為十進制:
7 * 16 ^ 2 + 10 * 16 + 15 * 1 = 1967
其中7在第2位, A在第1位, F在第0位, 是以分别乘16^i次方.
而1967轉換為十六進制:
1967 / 16 = 122 --- 餘15
122 / 16 = 7 --- 餘10
7 / 16 = 0 --- 餘7
将最後的餘數倒序排列, 得到的就是結果: 0x7AF.
每台計算機都由一個 字長(word size), 指明指針資料的标稱大小(nominal size) —— 虛拟位址就是以這樣的一個字來編碼的, 是以字長決定了系統的虛拟位址空間的最大大小:
32位字長限制虛拟位址空間為4千兆位元組(寫作4GB), 剛超過410^9;
64位字長限制虛拟位址空間為16EB, 大約是1.8410^19.
基本C資料類型的典型大小:
有些資料類型的确切位元組數依賴于程式是如何被編譯的.
程式有“32位程式”或“64位程式”之分, 差別在于該程式是如何編譯的, 而不是其運作的主控端器類型.
ISO C99 引入了一類資料類型, 其大小是固定的, 不随編譯器和機器的設定而變化, 其中就有資料類型
(4個位元組)和
int32_t
int64_t
(8個位元組).
使用确定大小的整數類型是開發人員準确控制資料表示的最佳途徑. 開發人員應該力圖使程式在不同的機器和編譯器上可移植, 移植性的一個方面就是 使程式對不同資料類型的确切大小不敏感.
對跨越多位元組的程式對象, 必須明确兩個規則:
- 對象的位址是什麼?
- 在記憶體中如何排列這些位元組?
有些機器選擇在記憶體中從最低有效位元組到最高有效位元組的順序存儲對象, 稱為小端法(little endian);
有些機器則恰恰相反: 最高有效位元組 -> 最低有效位元組, 稱為大端法(big endian).
以int類型的變量x為例, 它的十六進制值為 0x01234567, 位址範圍0x100~0x103的位元組順序依賴于機器的類型:
擴充:
大多數Intel相容機都隻用小端模式, 而IBM和Oracle的大多數機器則用大端模式.
但有些IBM和Oracle制造的PC使用的是Intel相容的處理器, 是以使用小端法.
盡管有些較新的微處理器是雙端法(bi-endian), 可實際情況是: 一旦標明了作業系統, 那麼位元組順序也就随之固定下來, 大端法與小端法不能同時存在.
未完待續...