参考自[关于求负数补码](https://www.cnblogs.com/chiweiming/p/8932140.html)
正整数的补码、反码均同其原码。负整数的补码是其反码(保留符号位,其他位取反)再+1,这将涉及进位操作。一个求负整数补码的技巧是:
1、求负数绝对值的原码;
2、从原码的最后一位往前数,当遇到第一个1时停在此位置;
3、将第一个1位前面的位全部取反。
对signed char而言,表达范围为[-2^7 , 2^7-1]
原码 | 反码 | 补码 | 规律 | |
127 | 0111 1111 | * | * | |
1 | 0000 0001 | * | * | |
0 | 0000 0000 | 0111 1111 | 0000 0000 | |
-1 | 1000 0001 | 1111 1110 | 1111 1111 | 1原码最右的1位左边所有位取反 |
-127 | 1111 1111 | 1000 0000 | 1000 0001 | 127原码最右的1位左边所有位取反 |
-128 | 1000 0000 | 1111 1111 | 1000 0000 | 128原码本身 |
//递推求整数(正整数、负整数)二进制原码
int GetBinaryDiTui(int n, vector<int>& arr) {
if (n<-1 * (pow(2, 7) - 1) || n>pow(2, 7)) return 0; //限求unsigned char
arr = vector<int>(8, 0);
if (n < 0) {
arr[0] = 1;
n = -1 * n;
}
int nCount = 0;
int a = 0;
while (n) {
a = n % 2;
nCount++;
arr[arr.size() - nCount] = a;
n = n / 2;
}
return 1;
}
//求整数(正整数、负整数)二进制补码
void GetBinaryBuCode(int n, vector<int>& arr) {
if (n >= 0) {
GetBinaryDiTui(n, arr);
return;
}
else {
GetBinaryDiTui(-1*n, arr); //求负数绝对值的原码
int nindex = arr.size() - 1;
while (arr[nindex] == 0) nindex--;
int n = 0;
while (n < nindex) {
arr[n] = arr[n] == 0 ? 1 : 0;
n++;
}
return;
}
}