补码验证

Posted jixiaohua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了补码验证相关的知识,希望对你有一定的参考价值。

以10进制表示打印一个十六进制数

#include <stdio.h>

int main(int argc, char const *argv[])

    // 1个字节数,16进制表示,2位
    // 1000 0001 = 0x81
    // 二进制、八进制、十六进制需要以计算机的角度,也就是补码来考虑
    char a = 0x81; 
    printf("a = %d\n", a); // -127
    return 0;

十六进制的81输出为10进制的-127,原因如下:

变量 a = 0x81,其值81是以补码形式表示的,也就是二进制的 1000 0001,而输出的-127是原码的表示,二进制表示为 ?1111 1111?,中间过程如下:

1、根据原码求补码(负数):

1)最高位符号位,其他位位二进制值(原码)

2)在1)的基础上,符号位不变,其他位取反

3)补码在2)基础上加 1

2、根据补码求原码,过程和求补码一样

1)二进制补码

2)在1)的基础上,符号位不变,其他位取反

3)补码在2)基础上加 1

上面 0x81二进制补码为 1000 0001,最高位为1,也就是说是一个负数。

其反码为 1111 1110,加1后原码为 1111 1111, 最高位符号位不计入值,则还剩7个1,也就是127,加上符号 -127

所以最终输出结果为-127。

关键点在于:

看到10进制数,站在用户角度,以原码角度思考问题

看到2进制、8进制、16进制数,站在计算机角度,要以补码角度思考问题

以上是关于补码验证的主要内容,如果未能解决你的问题,请参考以下文章

怎么求补码的原码?

知道 补码,如何 计算 原码

计算机补码原码问题

如何理解二进制原码,反码,补码,二进制补码运算

原码 反码 补码

二进制用补码做加减法怎么实现,举个例子??