基于算法竞赛的c++编程(23)原码,反码,补码

以下是关于原码、反码、补码的概念及其在C++中的实现方式:

原码

原码是数值的二进制表示形式,最高位为符号位(0表示正,1表示负),其余位表示数值的绝对值。例如:

  • 十进制数 5 的原码为 00000101(8位)。
  • 十进制数 -5 的原码为 10000101(8位)。
#include 
#include 
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)时,编译器默认处理补码。
  • 位操作(如右移 >>)对负数的行为依赖实现(通常为算术右移,保留符号位)。

你可能感兴趣的:(算法,c++,开发语言)