计算机中数的表示
1 原码、反码、补码
- 原码:正常的二进制表示,例如
x = 10, y = -10
,两者的源码为(其中最高位代表符号位,0代表整数,1代表负数):
x = 00000000000000000000000000001010
y = 10000000000000000000000000001010
- 反码:正数的反码和原码一样;负数的反码除符号位外,所有位取反,可以得到反码,上述
x, y
的反码如下:
x = 00000000000000000000000000001010
y = 11111111111111111111111111110101
- 补码:正数的反码和原码一样;负数的补码等于反码加一
x = 00000000000000000000000000001010
y = 11111111111111111111111111110110
- 补码是数据在计算机中真正的表示方式。
- 使用代码求解数据在计算机中的二进制表示:
#include <iostream>
#include <climits>
using namespace std;
// 输出x的二进制表示
void output(int x) {
for (int i = 31; i >= 0; i--) cout << (x >> i & 1);
cout << endl;
}
int main() {
output(10);
output(-10);
return 0;
}
- 输出:
00000000000000000000000000001010
11111111111111111111111111110110
- 特别的,0的原码,反码,补码:
2 几个特殊值在计算机中表示
- 代码:
#include <iostream>
#include <climits>
using namespace std;
// 输出x的二进制表示
void output(int x) {
printf("%-12d: ", x);
for (int i = 31; i >= 0; i--) cout << (x >> i & 1);
cout << endl;
}
int main() {
output(INT_MAX);
output(INT_MIN);
output(-1);
return 0;
}
- 输出:
2147483647 : 01111111111111111111111111111111
2147483647 : 01111111111111111111111111111111
-1 : 11111111111111111111111111111111
3 INT_MAX和INT_MIN的关系
-
INT_MAX + 1 = INT_MIN
。 -
代码:
#include <iostream>
#include <climits>
using namespace std;
// 输出x的二进制表示
void output(int x) {
for (int i = 31; i >= 0; i--) cout << (x >> i & 1);
cout << endl;
}
int main() {
cout << "INT_MAX + 1 : ";
output(INT_MAX + 1);
cout << "INT_MIN : ";
output(INT_MIN);
cout << endl;
cout << "INT_MAX : ";
output(INT_MAX);
cout << "INT_MIN + 1 : ";
output(INT_MIN - 1);
return 0;
}
- 输出:
INT_MAX + 1 : 10000000000000000000000000000000
INT_MIN : 10000000000000000000000000000000
INT_MAX : 01111111111111111111111111111111
INT_MIN + 1 : 01111111111111111111111111111111