### 1.Two's complement 二補數 ### 2.Big/small endian ### 3.Truncate截斷 rank:指一個東西的sizeof,例如int32_t的rank是4 當一個變數從比較大的rank的變數cast成比較小的rank的變數,就會發生truncate 例如由rank a的datatype cast成rank b的datatype,truncate會使讓變數只留下倒數b個byte - 範例: - 1.int32_t a=3; (int8_t)a=3; - 2.uint32_t a=65536;(uint8_t)=0;<span style="color:red">(overflow)</span> - 3.int32_t a=240; (int8_t)a=-16;<span style="color:red">(sign bit)</span> ### 4.Casting強制型別轉換 - Casting - rank高->rank低: <span style="color:blue">Truncate</span> - rank低->rank高: 前面補0或補1(負數) 範例: int32_t a=-3; int32_t b=3; (int8_t) a: ________11111101 (int16_t)a:1111111111111101 (int8_t) b: ________00000010 (int16_t)b:0000000000000010 ### 5.Operation 當int/uint和int/uint兩數之間在做運算(包括>,<)時,會先比較datatype的優先度,<span style="color:blue">再把兩數換成最優先的datatype做operation</span> - Casting in operation - <span style="color:red">先比rank,再比sign</span> - rank: rank高>rank低 - sign: unsigned>signed 範例: size_t 優先於 int32_t int32_t 優先於 uint8_t uint32_t 優先於 int32_t <span style="color:blue">這就是為什麼int跟uint8_t運算通常不會有事(除非你用到int8_t),而int跟size_t運算常有問題,如下:</span> (int32_t)5>(uint8_t)-3 (int32_t)5<(size_t)-3 <span style="color:red">error</span> 這是個無窮迴圈: for(int32_t i=5;i-sizeof(char)>=0;i--){}; (sizeof(char)的datatype是size_t) ### 6.Power-of-2 Divide with Shift 基本上跟lz教過的一樣,只差在<span style="color:blue">對於負奇數,如果我們要用右移代替/2,我們會先加1再右移,是為了保證它會向0取整。</span> 可以用-1,-3試試看這個論述。 ![](https://hackmd.io/_uploads/rJQdx_EF3.png)