---
# System prepended metadata

title: Integer Arithmetic

---

### 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)
