原码、反码和补码之间的转换

  • (꒪ꇴ꒪(꒪ꇴ꒪ ),hello我是祐言
  • 博客主页:C语言基础,Linux基础,软件配置领域博主
  • 快上,一起学习!
  • 送给读者的一句鸡汤:
  • 集中起来的意志可以击穿顽石!
  • 作者水平很有限,如果发现错误,可在评论区指正,感谢

一、认识原码反码补码

        原码、补码和反码是用来表示有符号整数的三种表示方法,它们在计算机中常用于进行数值运算和存储。

 1.原码(Sign-Magnitude Representation)

        最高位为符号位(0 表示正数,1 表示负数),其余位表示数值部分。
        例如,正数 +5 的原码为 00000101,负数 -5 的原码为 10000101。


2.反码(One's Complement Representation)

        正数的反码与其原码相同。
        负数的反码是将其原码中除符号位外的每一位取反(0 变为 1,1 变为 0)。
        例如,正数 +5 的反码为 00000101,负数 -5 的反码为 11111010。


3.补码(Two's Complement Representation)

        正数的补码与其原码相同。
        负数的补码是在其反码的基础上加 1。
        这里要注意一点:补码的最高位仍然表示符号位。
        例如,正数 +5 的补码为 00000101,负数 -5 的补码为 11111011。


二、计算机中补码表示法特点

  • 可以同时表示正数和负数,且不需要额外的符号位,简化了数值运算和逻辑判断。
  • 补码的加法和减法操作可以使用相同的硬件电路,简化了计算机的设计。
  • 补码的溢出操作符合模运算的性质。

        在进行原码、反码和补码之间的转换时,需要注意以下几点:

        (1)由于负数的补码是在其反码的基础上加 1,所以对于负数,要先将其转换为反码,然后再加 1 得到补码。
        (2)对于补码,将其减 1 可以得到其反码,再将反码的每一位取反可以得到原码。
        (3)这些表示法的选择取决于具体的应用和计算机系统的设计,补码表示法是最常用的一种,因为它简化了数值运算和编码逻辑,且可以有效地处理负数溢出。


示例展示:

原码、反码和补码之间的转换_第1张图片

程序:

#include 

// 原码转换为反码
int originalToComplement(int original) {
    if (original >= 0) {
        return original;
    } else {
        return ~original;
    }
}

// 反码转换为原码
int complementToOriginal(int complement) {
    if (complement >= 0) {
        return complement;
    } else {
        return ~complement;
    }
}

// 原码转换为补码
int originalToTwosComplement(int original) {
    if (original >= 0) {
        return original;
    } else {
        return ~original + 1;
    }
}

// 补码转换为原码
int twosComplementToOriginal(int twosComplement) {
    if (twosComplement >= 0) {
        return twosComplement;
    } else {
        return ~twosComplement + 1;
    }
}

int main() {
    int num = -5;

    int complement = originalToComplement(num);
    int original = complementToOriginal(complement);
    int twosComplement = originalToTwosComplement(num);
    int originalFromTwosComplement = twosComplementToOriginal(twosComplement);

    printf("原码:%d\n", num);
    printf("反码:%d\n", complement);
    printf("补码:%d\n", twosComplement);
    printf("从补码转换回原码:%d\n", originalFromTwosComplement);

    return 0;
}

写在最后

  • 今天的分享就到这啦~
  • 觉得博主写的还不错的烦劳 一键三连喔~
  • 感谢关注

你可能感兴趣的:(手撕C语言,玩转Linux,c语言,码制)