补码验证

以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进制数,站在计算机角度,要以补码角度思考问题

posted @ 2019-06-23 18:38  jixhua  阅读(693)  评论(0编辑  收藏  举报