在計(jì)算機(jī)中int型數(shù)字使用補(bǔ)碼的形式在存儲(chǔ)。
首先說(shuō)明補(bǔ)碼的計(jì)算方式塞帐。
正數(shù)和零的補(bǔ)碼就是他們本身。
負(fù)數(shù)的補(bǔ)碼是符號(hào)位(最高位)不變巍沙,其他位取反的結(jié)果+1葵姥。
例如
1的補(bǔ)碼為1
0的補(bǔ)碼為0
-1的原碼為
10000000_00000000_00000000_00000001
取反碼
11111111_11111111_11111111_11111110
補(bǔ)碼為反碼加1
11111111_11111111_11111111_11111111
可以看到下面的程序
#include <iostream>
using namespace std;
int main(void) {
int i = 1;
cout<<hex<<i<<endl;//1
i = 0;
cout<<i<<endl;//0
i = -1;
cout<<i<<endl;//ffffffff
unsigned int j = 0x7fffffff;//max int 2147483647
cout<<dec<<(int)j<<endl;
unsigned int k = 0x80000000;//min int -2147483648
cout<<(int)k<<endl;
}
函數(shù)形式為:從小到大,然后突然跳變句携,最后又從小到大
0->0x7fffffff->0x80000000->0xffffffff
0->2147483647->-2147483648->-1
可知對(duì)一個(gè)數(shù)取負(fù)的過(guò)程為
1
0x00000001
-1
0xfffffffff
首先改變符號(hào)位
0x10000001
然后取補(bǔ)碼
0xffffffff
有沒(méi)有更為方便的方法呢榔幸?全部取反然后加一即可。