↓
↓
改良 - 不用「循環進位」(end-around carry)
在一補數中,如果進行運算後有溢位,須在和的基礎上再加上進位,也就是又多了一次電路運算
二進位 十進位
11111110 -1
+ 00000010 +2
............ ...
1 00000000 0 <-- 錯誤答案
1 +1 <-- 加上進位
............ ...
00000001 1 <-- 正確數值
改良 - 0的表示法唯一
在一補數裡,00000000
) 和 11111111
),而二補數就只剩下00000000
) 這個唯一的表示法。
如此最大的好處,並不是數值表示範圍又多了一個空位 … 而是「判斷是否為0」的運算成本減半 : 不然原本電路需要進行+0、-0的比較後才能確定一數是否真不為0
if(x != 0x00 && x != 0xff) {...}
改良 : 不用循環進位、0
的表示法從2種變成1種 (「判斷是否為0運算」成本減半)
首先將0
設定為00000000
,則1
會變成00000001
、2
變成00000010
,以此類推 …
至於-1
如何表示 ? 我們知道0
和1
的編碼,所以 x + 00000001 = 00000000
,也就是說,x
為11111111
而-2
呢? 因為-1
,我們可以再推算出-2
為11111110
,-3
、-4
等等亦是同理。
如上述所說,數值早在一補數時期就已經沒有正負號之分了,但是C語言裡面還是有 有 / 無 號數的型態之分,這除了是轉換成十進位(或字元etc…)給人看以外,也是給少數處理器指令看的。
因為有些時候一數值是正、是負會影響到處理器指令的行為,比如 : 把原本儲存在8bit位元的某數,搬移到16bit位元的新位址。這時就得先知道此數值到底是正還是負,而不能亂轉移。
比如 : 1001101
怎麼移植? 如果是正數,代表00000000 1001101
,11111111 1001101
,
可以想見,如果搬移時正負號搞錯,則
Pointer to pointer 有一個很重要的應用 - 更改變數的 life time : 因為C裡面的函式都是 call by value,可以說在 function 裡面操作的 parameter 都是原始 object 的「複本」,出了function後原本object的value還是不會改變。 因此很多時候我們必須寫func(&var)傳入 object 的地址,讓 function 內部可以更改原始 object 的內容。
Jun 14, 2024你可能沒想過的 Memory malloc有可能不成功,即便回傳valid pointer也不一定能用! 因為當我們 malloc() 的時候,記憶體預設是允許==overcommit==的,如果記憶體實際有32MB,但你可以malloc遠超32MB。 但這可能會導致非常糟糕的結果 - 宣告時沒事,但真去操作時卻會把任意 process 殺掉。 alloc 給 valid pointer不要太高興,等你要開始用的時候搞不好作業系統給個 OOM。簡單來說就是一張支票,能不能拿來開等到兌現才知道 OOM Killer (Out-Of-Memory Killer),他會在沒有記憶體不夠用時會被喚醒,並砍掉一些 process 以釋放記憶體給你用。 但你無法確定到底哪些會被砍,甚至連你自己都會被砍。 所以也有人認為這個從 overcommit 到 OOM Killer 的機制根本就是個Bug mlock : mlock要求(不一定會被O.S接受)特定記憶體區塊常駐於此,而不會被置換 ( swap out ) 到硬碟的/swap裡面。
May 15, 2022symbol : 人類可以看懂得自對應到一個記憶體位址 程式通常不會直接操控記憶體,而是操控虛擬記憶體,虛擬記憶體才會再 mapping 到實體記憶體空間。 而這些虛擬記憶體的單元就稱為==MMU==,Memory Managment Unit : 基本觀念 : 每個function都對應到一個記憶體上的地址 通常function call都是==有來有回== ( 雖然也有例外 ),比如 funcA() -> funcB()。 那當function B執行完後,他必須想辦法回到原本的function A裡面,並接續原本中斷的地方繼續執行下去。這也就代表在離開A前往B之前,需要先將原本的一些data記錄下來,比如 : return address、argument、variable(畢竟B已經離開A的生命週期),而這些資料就會統整放在記憶體的stack裡面,稱為一個==stack frame== brk、sbrk(program break) : 改變程式data在記憶體的空間。 ==malloc/free==實際上就是用sbrk做的。
May 15, 2022作業要求 從 課程簡介和注意須知, 第 1 週測驗題 選出你感興趣的 3 個題組進行作答,並且回答附帶的「延伸問題」 應當包含 課程簡介和注意須知 的 Page 9 到 Page 16 裡頭的 C 語言程式設計議題 比照 課前測驗參考解答: Q1 和 對 Linked List 進行氣泡排序 的模式來撰寫共筆,需要詳細分析自己的想法、參閱的材料 (包含 C 語言規格書的章節),以及==進行相關實驗== 閱讀 第一週課程進度 所有材料,記錄所見所聞並提問,若有不能理解的部分,請標註出來。善用 HackMD 的語法 :::info 和 ::: 標註你的提問 :::info 像是這樣標註提問
Apr 10, 2021or
By clicking below, you agree to our terms of service.
New to HackMD? Sign up