1. 程式人生 > 其它 >2022-3-28 CSAPP學習筆記(第一章+第二章到2.2.4)

2022-3-28 CSAPP學習筆記(第一章+第二章到2.2.4)

CSAPP(深入理解計算機系統)

計算機系統漫遊


資訊表示和處理

資訊儲存(Infomation Storage)

虛擬記憶體空間示意圖



1. 棧區(stack):由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。
2. 堆區(heap):一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由OS回收。注意它與資料結構 中的堆是兩回事,分配方式倒是類似於連結串列。
3. 全域性/靜態區(static):全域性變數和靜態變數的儲存是放在一塊的,在程式編譯時分配。
4. 文字常量區:存放常量字串。
5. 程式程式碼區:存放函式體(類的成員函式、全域性函式)的二進位制程式碼
//大端就是符合人的直覺,小端就是反過來

實現掩碼運算

x&0xFF //x的最低有效位元組,其他位均置為0
x^~0xFF//除了x的最低有效位元組外,其他的位都取補,最低有效位元組保持不變。
x|0xFF//最低有效位元組設定成全1,其他位元組保持不變。
/*
x^y=(x&~y)|(~x&y)
x=0x66 y=0x39

x&&~y的結果為0x01
*/
一般無符號數進行邏輯右移,有符號數進行算數右移(即邏輯是補0,而算數右移是補1).

整數表示

補碼反碼

因為一半的位模式(符號位設定為1的數)表示負數,而一半的數(符號位設定為0的數)表示非負數。因為0是非負數,能表示的整數就比負數少一個。
c語言設定的強轉無符號數->有符號數,利用的是改變解釋位
ex:
short int x=-12345;
usigned short int b= (usigned short )x;
->>最後輸出結果為 -12345 53191//主要是第一位的權重不對
/*
所謂計算機的補碼,實際上就是經過計算後的原始碼,只是第一位是權重位,如果是1,則*(-1)再加上其他位正常.

*/
上面這個式子就解釋了補碼的由來,有符號數->無符號數

c語言會隱式地將有符號數強制轉化成無符號數來執行計算。