基于算法竞赛的c++编程(23)原码,反码,补码
以下是关于原码、反码、补码的概念及其在C++中的实现方式:
原码
原码是数值的二进制表示形式,最高位为符号位(0表示正,1表示负),其余位表示数值的绝对值。例如:
- 十进制数
5
的原码为00000101
(8位)。 - 十进制数
-5
的原码为10000101
(8位)。
#include <bitset>
#include <iostream>
using namespace std;int main() {int num = 5;bitset<8> original(num); // 原码(仅适用于正数)cout << "原码(正数):" << original << endl;
}
反码
反码是对原码的符号位不变、数值位取反得到的结果:
- 正数的反码与原码相同。
- 负数的反码是符号位保持为1,数值位按位取反。例如:
-5
的原码为10000101
,反码为11111010
。
int main() {int num = -5;unsigned int mask = ~0; // 全1掩码bitset<8> ones_complement((unsigned int)(num) ^ (mask >> (32 - 8)));cout << "反码:" << ones_complement << endl;
}
补码
补码是计算机中存储有符号数的标准方式:
- 正数的补码与原码相同。
- 负数的补码为反码加1。例如:
-5
的反码为11111010
,补码为11111011
。
int main() {int num = -5;bitset<8> twos_complement(num);cout << "补码:" << twos_complement << endl;
}
补码的特性
补码的优势在于统一了加减法运算,避免了符号位的特殊处理。例如:
int main() {int a = 5, b = -3;int sum = a + b; // 直接使用补码运算bitset<8> sum_bits(sum);cout << "补码加法结果:" << sum_bits << "(十进制:" << sum << ")" << endl;
}
注意事项
- 在C++中,直接使用有符号整数类型(如
int
)时,编译器默认处理补码。 - 位操作(如右移
>>
)对负数的行为依赖实现(通常为算术右移,保留符号位)。