在C语言编程中,我们经常会看到类似0x1A、0xFF这样的数字写法,其中0x是C语言规定的十六进制数值前缀,用来明确标识后面的数字属于十六进制计数体系,和十进制、八进制共同构成C语言支持的三种常用进制表示方式。

十六进制的基本规则
十六进制是逢16进1的计数方式,除了0到9这10个常规数字外,还用A到F(或小写a到f)表示10到15的数值,具体对应关系如下:
| 十六进制字符 | 对应十进制数值 |
|---|---|
| A / a | 10 |
| B / b | 11 |
| C / c | 12 |
| D / d | 13 |
| E / e | 14 |
| F / f | 15 |
当数字以0x开头时,编译器就会按照十六进制的规则解析后续字符,比如0x1A就表示1*16 + 10 = 26的十进制数值。
0x前缀的常见使用场景
变量赋值
我们可以直接用0x开头的十六进制数给整型变量赋值,这种方式在嵌入式开发、位运算场景中非常常见,因为十六进制和二进制的转换更直观,每4位二进制数刚好对应1位十六进制数。
#include <stdio.h>
int main() {
// 十六进制0x1A赋值给变量a,对应十进制26
int a = 0x1A;
// 十六进制0xFF赋值给变量b,对应十进制255
int b = 0xFF;
printf("a的十进制值:%dn", a);
printf("b的十进制值:%dn", b);
return 0;
}
格式化输出
如果需要把十进制数以十六进制的形式输出,可以使用printf函数的格式控制符,%x输出小写十六进制,%X输出大写十六进制,输出的结果会自动带上0x前缀吗?默认不会,需要手动添加。
#include <stdio.h>
int main() {
int num = 255;
// 输出小写十六进制,手动添加0x前缀
printf("小写十六进制:0x%xn", num);
// 输出大写十六进制,手动添加0x前缀
printf("大写十六进制:0x%Xn", num);
return 0;
}
不同进制的转换对比
C语言中除了0x开头的十六进制,还有0开头的八进制,默认不加前缀的是十进制,三者的对比如下:
- 十进制:无前缀,数值范围0-9,逢10进1,比如123
- 八进制:前缀为0,数值范围0-7,逢8进1,比如0123对应十进制83
- 十六进制:前缀为0x,数值范围0-9、A-F,逢16进1,比如0x123对应十进制291
如果需要手动计算十六进制转十进制,只需要把每一位乘以16的对应次方再求和即可,比如0x2F的计算过程是2*16^1 + 15*16^0 = 32 + 15 = 47。
注意事项
使用0x前缀时要注意字符的大小写不敏感,0xFF和0xff是完全等价的。另外不要和字母o混淆,前缀是数字0不是字母o,写错会导致编译错误。在涉及位操作的场景中,使用十六进制表示掩码会更清晰,比如0x0F可以很直观地看出是低4位为1的掩码,比十进制15的可读性更高。