C 語言 機器碼/位運算/大端小端
阿新 • • 發佈:2020-09-14
在計算機中資料以二進位制儲存
位bit 0/1 bety位元組 8bit Word(字) (intel中16bit) Dword (雙字) Qword (四字) Tbyte (十位元組)
真值:-111 //以十進位制數 -111為例 短除法求其他進位制: 111 ÷ 2 = 55 …… 1; 55 ÷ 2 = 27 …… 1; 27 ÷ 2 = 13 …… 1; 13 ÷ 2 = 6 …… 1; 6 ÷ 2 = 3 …… 0; 3 ÷ 2 = 1 …… 1; 1 ÷ 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 表示的是-128; 0000 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;若是帶符號數,則補入的數全部等於原數的最左端位上的原數(即原符號位)