使用printf打印十六进制数值时输入被识别为十进制的原因是什么?
printf 格式说明符与数值字面量的进制规则说明
- 首先要明确两个完全独立的规则:数值字面量的解析规则、printf 格式说明符的作用,二者互不干扰:
- 数值字面量的进制仅由书写语法决定,编译阶段就已经完成解析:
- 无前缀的数字,C 语言默认识别为十进制数
- 前缀加
0x/0X的数字,才会被识别为十六进制数 - 前缀加
0的数字,会被识别为八进制数
你示例中写的16没有任何前缀,编译器会直接把它解析为十进制的16,对应内存中存储的二进制值就是00010000,这个值在编译完成后就已经固定,和后续用什么方式打印没有任何关系。
- 数值字面量的进制仅由书写语法决定,编译阶段就已经完成解析:
- printf 的格式说明符只决定输出时的进制转换逻辑,不会修改原始存储的数值:
%d:把内存中的二进制值转为十进制字符串输出%x:把内存中的二进制值转为小写十六进制字符串输出%X:把内存中的二进制值转为大写十六进制字符串输出
你示例中用%x打印十进制16对应的二进制值,转换为十六进制后就是10,属于符合预期的正确输出。
如果希望输出十六进制的16,可以使用以下两种写法:
// 写法1:传入十六进制0x16对应的十进制值22 printf("%x", 22); // 写法2:直接用十六进制语法写字面量,可读性更高 printf("%x", 0x16);
以上两种写法执行后都会输出16。
内容的提问来源于stack exchange,提问作者Muneesh
相关产品推荐
相关产品推荐

