补码验证
以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进制数,站在计算机角度,要以补码角度思考问题
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探