1. 程式人生 > 實用技巧 >C 語言 機器碼/位運算/大端小端

C 語言 機器碼/位運算/大端小端

在計算機中資料以二進位制儲存

位bit                 0/1
bety位元組              8bit
Word(字)        (intel中16bit) 
Dword                (雙字)    
Qword                (四字)
Tbyte               (十位元組)        
真值:-111         //以十進位制數 -111為例

短除法求其他進位制:  
111 ÷ 2 = 55 …… 155  ÷ 2 = 27 …… 1
27 ÷ 2 = 13 …… 113 ÷ 2 = 6 …… 16 ÷ 2 = 3 …… 03 ÷ 2 = 1 …… 11 ÷ 2 = 0 …… 1;  //從下往上寫11101111; 轉十進位制可以使用加權法: 1*2^0 + 1*2^1 +1*2^2 + 1*2^3 + 0*2^4 + 1*2^5 + 1*2^6 + 1*2^7 = 111 熟練後可以
0000 0000       //正負 64 32 16 8 4 2 0 原碼:11101111;    //以二進位制表示 最高位 1 表示 負;0 表示 正; 反碼:10010000;    //除了最高位 1變0 0變1; 補碼:10010001。    //在反碼的基礎上+1;
//如果是正數,那麼原碼反碼補碼都是原碼;

需要注意的是在計算機中數值全部以補碼來儲存

例如:
unsigned char;
無符號,1位元組,取值範圍0~2^8-1,即2^8個數;

char
取值範圍為-2^7~2^7-1(-128~127);  
1000 0000 表示的是-1280000 0000 表示的是0;

計算機不會做減法例如 -128-3 == -127 + (-1)

-127
= 1111 1111;補碼:1000 0001; -1 = 1000 0001;補碼:1111 1111; 補碼相加:1 1000 0000; 再轉化為原碼:1000 0000(-128);

位運算:

printf("%d",1 & 2);        //0001(補碼) & 0010(補碼) = 0000(補碼) = 0000(原碼) = 0;
printf("%d",1 | -2);       //0001(補碼) | 1110(補碼) = 1111(補碼) = 1001(原碼) = -1;
printf("%d",1 >> 2);       //0001(補碼)去掉右邊兩位,左邊補兩個0 = 0000(原碼) = 0;
printf("%d",-1 << 2);      //1111(補碼)去掉左邊兩位,右邊補兩個0 = 1100(原碼) = -4;
printf("%d", ~2);          //~按位取反運算子 優先順序高於>>右移位運算子;  0010(補碼) ~(包括符號位一起取反) 1101(補碼) = 1011(原碼) = -3;
printf("%d",1 ^ 2);        //相同為0不同為1:0001(補碼) ^ 0010(補碼) = 0011(原碼) = 3;
//如果是左移,則規定補入的數全部是0;如果是右移,還與被移位的資料是否帶符號有關。若是不帶符號數,則補入的數全部為0;若是帶符號數,則補入的數全部等於原數的最左端位上的原數(即原符號位)