在计算机中int型数字使用补码的形式在存储。
首先说明补码的计算方式。
正数和零的补码就是他们本身。
负数的补码是符号位(最高位)不变,其他位取反的结果+1。
例如
1的补码为1
0的补码为0
-1的原码为
10000000_00000000_00000000_00000001
取反码
11111111_11111111_11111111_11111110
补码为反码加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;
}
函数形式为:从小到大,然后突然跳变,最后又从小到大
0->0x7fffffff->0x80000000->0xffffffff
0->2147483647->-2147483648->-1
可知对一个数取负的过程为
1
0x00000001
-1
0xfffffffff
首先改变符号位
0x10000001
然后取补码
0xffffffff
有没有更为方便的方法呢?全部取反然后加一即可。