機器級的程式將記憶體視為一個位元組陣列,稱為虛擬記憶體(virtual memory)。記憶體的每個位元組都由一個唯一數位標識,稱為該位元組的地址(address),所有地址的集合稱為虛擬地址空間(virtual address space)。
每臺計算機都有一個字長(word size),指明整數和指標資料的標稱大小(norminal size)。虛擬地址就是這麼編碼的,對於32位元字長的計算機,限制了他的虛擬地址空間位232-1位4GB,對於64位元字長的計算機,記憶體最大支援128G。
一個物件儲存有大端法和小端法,最低有效位在最前面的方式被稱為小端法,另一種稱為大端法。許多晶片在加電啟動時確定位元組順序規則。假設有一個0x1234567在地址範圍0x100~0x103儲存,順序如下
大端法 | 0x100 | 0x101 | 0x102 | 0x103 | |
... | 01 | 23 | 45 | 67 | ... |
小端法 | 0x100 | 0x101 | 0x102 | 0x103 | |
... | 67 | 45 | 23 | 01 | ... |
"~":邏輯運算NOT
"&":邏輯運算AND
" | ":邏輯運算OR
" ^ ":互斥或運算EXCLUSIVE-OR,PQ為真但不全為真時成立
~ | & | 0 | 1 | | | 0 | 1 | ^ | 0 | 1 | ||||
0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | |||
1 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
C的表示式 | 二進位制表示式 | 二進位制結果 | C的結果 |
~0x41 | ~[01000001] | [10111110] | 0xBE |
~0x00 | ~[00000000] | [11111111] | 0xFF |
0x69&0x55 | [01101001]&[01010101] | [0100001] | 0x41 |
0x69 | 0x55 | [01101001] | [01010101] | [01111101] | 0x7D |
x << k | 將x向左移動k位,丟掉k個最高位,右端補k個0 |
一個整數資料型別有 w 位,可以寫成[xw-1, xw-2, ..., x0],可以得到無符號數的二進位制表示形式(式1)
在計算機中希望使用二進位制二補數形式表現有符號數(負數),其中最高位解釋為負權或符號位,正數的原碼、反碼、二補數都相等,負數的反碼是除符號位外取反,二補數等於反碼加1(式2)
數位 | 原碼 | 反碼 | 二補數 | 直接計算 |
-10 | 10001010 | 11110101 | 11110110 | -1*27+26+25+24+22+21=-10 |
10 | 00001010 | 00001010 | 00001010 | 23+21=10 |
從這裡理解有符號數和無符號數的對映,有符號數的正數部分對應了無符號數相同大小的正數部分,而有符號數負數的部分對應了更大的無符號數部分,反過來無符號數較大的部分會對應有符號數的負數
對於數位的截斷,如果將一個32位元整數截斷到16位元,會截斷32位元前面的16位元,保留後面的16位元
無符號運算可以被視為一種模的運算。例如考慮一個四位數表示,x=9和y=12,[1001]和[1100]。它們的和是21,五位表示為[10101],但如果截斷最高位會得到[0101],也就是5,這和 21 mod 16 = 5一致
二進位制二補數運算中存在移除情況,根據式2可以很好理解,0111 1111是正數最大值,而1000 0000是負數最小值,所以正數向上溢位後會是最小的負數,而負數向下溢位後是最大的正數