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