二进制位运算
1. ?數的原碼補碼轉換
計算機運算中,數都是由補碼表示的。正數的補碼就是原碼;負數的補碼就是各位(包括符號位)取反,再加上1。假設數是8位的,最高位為符號位。1的補碼是0x00000001,-3的補碼是0xFFFFFFFD。
如果由補碼轉化為原數:正數不變;負數的補碼是各位(包括符號位)取反,再加上1得到負數的絕對值,再貼上符號。補碼0x00000010的數是1,補碼0xFFFFFFE4的數的絕對值是000111002=2810,則該數是-28。
下面代碼的輸出是-30:
1 #include <stdio.h> 2 3 int main() { 4 int myInt; 5 myInt = 0xFFFFFFE2; 6 printf("%d\n",myInt); 7 8 return 0; 9 }?
2. 對負數取補碼,為什么要對絕對值的原碼取反加1?
以-75為例。注意,7510=010010112。對-75取得它的機器表示,也就是0-75,下面是轉換的過程:
可以看到,-75的機器表示的過程=28-75=11111111+1-01001011=11111111-01001011+1。而11111111-01001011相當于對75取反碼,所以-75的取補碼過程就是對75先取反碼,然后加1。所以,推廣得來看,對于負數的補碼,要對該負數的絕對值的原碼取反加1。
?
?
參考:
https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html#fromtwo
https://en.wikipedia.org/wiki/Two%27s_complement
轉載于:https://www.cnblogs.com/Deribs4/p/5661943.html
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
- 上一篇: NOIP2011 聪明的质监员
- 下一篇: 集群中的session共享存储 实现会话