深入理解計算機系統筆記之第二章(一)
阿新 • • 發佈:2018-11-17
資訊的表示和處理(一)
- 大多數計算機使用8位的塊(也就是一個位元組byte),由此可以看到32位(4個位元組)系統和64位(8個位元組)系統的區別。32位系統在於cpu可以同時處理4個位元組(32位)的資料,那麼64位系統cpu可以同時處理8個位元組(64位)的資料。
- 一個位元組(byte)由8位組成,值域 00000000(2)~11111111(2) == 0(10)~255(10) == 00(16)~FF(16)。正是因為十進位制與位模式的互相轉化很麻煩,而二進位制的四位可表示為十六進位制的一位,所以用採用十六進位制來轉換二進位制。
十六進位制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
二進位制 | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
舉例:0x173A4C(16) => 0001 0111 0011 1010 0100 1100(2)
1 7 3 A 4 C
11 1100 1010 1101 1011 0011(2) => 3 C A D B 3(16)
3.對於一個字長為w位的機器而言,虛擬地址的範圍為0~2w-1,程式最多訪問2w個位元組
有符號 | 無符號 | 32位 | 64位 |
---|---|---|---|
char | unsigned char | 1 | 1 |
short | unsigned short | 2 | 2 |
int | unsigned | 4 | 4 |
long | unsigned long | 4 | 8 |
int32_t | uint32_t | 4 | 4 |
int64_t | uint64_t | 8 | 8 |
char* | 4 | 8 | |
float | 4 | 4 | |
double | 8 | 8 |
4.假設變數x的型別為int, 位於地址0x100 ,16進位制的值為0x01234567 (0被叫做高位位元組,7被叫做低位位元組)
地址範圍0x100~0x103位元組順序機器不同型別:
0x100 | 0x101 | 0x102 | 0x103 | |||
---|---|---|---|---|---|---|
大端法 | … | 01 | 23 | 45 | 67 | … |
小端法 | … | 67 | 45 | 23 | 01 | … |
5.布林代數
非運算:1100 => 0011
與運算&: 0110 & 1100 => 0100
或預算|:0110 | 1100 => 1110
異或運算 ^ : 0110 ^ 1100 => 1010
&&(邏輯運算子) 與 &(位級運算子) 的區別:若對於第一個引數求值,就能確定表示式結果,那麼邏輯運算子不會對第二個引數求值。
if(j2 & i++) 和 if(j2 && i++) 分別printf("%d\n",i) 結果可能不一樣
6.移位運算
x | 01100011 | 10010101 |
---|---|---|
x<<4 | 00110000 | 01010000 |
x>>4(邏輯右移) | 00000110 | 00001001 |
x>>4(算術右移) | 00000110 | 11111001 |
幾乎所有編譯器/機器:有符號->算術右移 無符號->必須邏輯右移
java:x>>k 算術右移 x>>>k 邏輯右移
7.64位系統下:
char | -128 | 127 |
---|---|---|
unsigned char | 0 | 255 |
short | -32768 | 32767 |
unsigned short | 0 | 65535 |
int | -2147483648 | 2147483647 |
unsigned | 0 | 42億 |
|TMin| = |TMax| + 1
UMaxw = 2w-1
TMinw = -2(w-1) TMaxw = 2(w-1)-1
9.強制型別轉換的結果保持位置不變,只是改變解釋這些位的方式。
如:T2U32(-1) = 4294967295 U2T32(4294967295) = -1