1. 程式人生 > >深入理解計算機系統筆記之第二章(一)

深入理解計算機系統筆記之第二章(一)

資訊的表示和處理(一)

  1. 大多數計算機使用8位的塊(也就是一個位元組byte),由此可以看到32位(4個位元組)系統和64位(8個位元組)系統的區別。32位系統在於cpu可以同時處理4個位元組(32位)的資料,那麼64位系統cpu可以同時處理8個位元組(64位)的資料。
  2. 一個位元組(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