• 补码验证


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

    #include <stdio.h>
    
    int main(int argc, char const *argv[])
    {
        // 1个字节数,16进制表示,2位
        // 1000 0001 = 0x81
        // 二进制、八进制、十六进制需要以计算机的角度,也就是补码来考虑
        char a = 0x81; 
        printf("a = %d
    ", 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进制数,站在计算机角度,要以补码角度思考问题

  • 相关阅读:
    [Windows Powershell]-学习笔记(1)
    MyBatis For .NET学习-问题总结
    Zynq学习笔记(1)
    规范的位操作方法
    浮点数转换成字符串函数
    测试卡尔曼滤波器(Kalman Filter)
    关于按键扫描程序的终极讨论
    关于STM8的用户数据空间读写问题
    IPv4分析
    关于STM8空间不足的解决方法
  • 原文地址:https://www.cnblogs.com/jixiaohua/p/11073711.html
Copyright © 2020-2023  润新知