就像之前提到的

組合語言單看書真的是讀不下去了

所以又換了一門

號稱資工系三大必修之一

計算機組織與結構

一開始當然也是借書來看

雖然已經是借中文書

但還是不知道在說什麼

最後還是得上網找開放式課程

這次是交大的李逸朗老師所開設的

書上輕描淡寫帶過的重點

老師都會鉅細靡遺的講解前因後果

舉幾個例子

第一個就是二進位補數系統

很久很久以前就聽過二進位補數

但不知道為什麼要使用這個系統

原來是因為二進位補數只有一個零

沒有正負0

以計算機的角度來說

有很多狀況要考慮是否等於零

使用二進位補數

可以避免兩個0的問題

另外一個二進位補數的好處

就是做a+b減法時

只要做a+ “b的補數”就可以了

還可以判斷是否有溢位

好處多多

加減法相對容易理解

但是乘除法就難上許多了

因為在cpu內沒有什麼乘法器除法器

所以實際上乘法是透過連續加法

加上用shift達到進位的目的

達到乘法的效果

當然還有一個最基本又最難的

就是浮點數啦

據說大部分人都會有”我懂浮點數”的幻覺

到現在我也還是懵懵懂懂的    

之前看過很多種版本的浮點數介紹

但是同時介紹浮點數

又介紹浮點數在cpu的運算原理

就真的少之又少

這也是第一次了解到

浮點數的假數部分

為什麼要加上偏移值

就是因為要讓假數的部分變成unsign

如此在比大小的時候

才不用考慮正負數的問題

運算才會快

這也是我對unsign的新理解

還有各種ALU的判斷

沒有先看過數位邏輯

真的是有一點點吃力

要看懂各種and or xor 閘

另外就是重點中的重點

指令集的設定

固定就是32bit的指令長度

該留多少給操作碼

留多少給多少指令

一樣是各種trade off

各種magic number

和看作業系統的感覺一樣

前人的心血結晶啊

反觀最近上班的專案

自己的寫的東西就真的很小兒科QQ

不過好處就是大部分需求都在掌握當中

除了一個比較難的問題

就是解決layouy的衝突問題

我們App是做討論區

由於單篇文章內容有很多區塊

包含發文者,日期,內容

圖片,按讚,留言數等等資訊

畫面上其實滿複雜的

之前其實就有發現

載入文章頁面時

console視窗就會跳出一大段錯誤提示

警告你的layout衝突了

並且自動把某條constraint刪除

所以畫面上看起來都正常

其實是底層的系統幫你處理好了

這個問題說會沒影響就沒影響

畢竟使用者看不到錯誤log

說有影響也是有影響

苦主就是我自己

每次debug都要被一堆雜訊干擾

所以這一期排了一些時間

來解決這個問題

沒想到還真的不好解決

因為文章的高度

會隨著內容的長度有變

再加上有圖片和沒有圖片的考量

以及放在tableView裡面的影響

花了很多時間下去修正

錯誤log還是不留情的給你刷一整排

跟熱門實況主的聊天室一樣

可惜我不是實況主

沒辦法ban人

程式就是這麼無情

錯就是要告訴你

搞了半天沒有成果

最後一個惱羞成怒

清除所有constraint

從畫面的最上面開始重新拉過

拉到看哪一個爆衝突

就去解決它

又多花了三四個小時

才終於解決

最後結論就是

往下的constraint的優先度要調降為999

一路往下拉上去

就可以正常長出來囉

不過本篇的重點不是講解決衝突

而是同事分享的”用視覺化的程式碼拉layout”

簡單來說就是長得像下面這個樣子

let horizontal = “H:|-40-[centerView]-100-|”

let vertical = “V:[centerView]-120-|”

就是剛剛說的會報錯的系統訊息格式

如果不是同事分享

還真的沒想過可以這樣拉

不過會這樣做當然是有原因的

因為他們開發的是跨專案的模組

而Storyboard在跨專案時

通常會發生一些未知的bug

所以才傾向用code生成畫面

並且也用code生成Constraint

一般專案還是建議直接在畫面上拉

不過還是分享一下

真的滿厲害的