补码验证

以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 @   jixhua  阅读(717)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示