- (b) 16进制整数的表示
- (c) 16进制相关的运算符
(b) 16进制整数的表示
在 C 语言中,如果要在代码中直接写一个 16 进制(也叫“十六进制”)的整数,需要在数字前面加上前缀 0x 或 0X。

(图片来源网络,侵删)
语法
int number = 0x1A; // 使用 0x 前缀 int number2 = 0XFF; // 使用 0X 前缀 (大写 X 也可以)
规则
- 前缀:必须以
0x或0X开头,告诉编译器这是一个 16 进制数。 - 有效字符:后面的部分只能包含
0-9和a-f(或A-F)。0-9对应 10 进制的 0 到 9。a或A对应 10 进制的 10。b或B对应 10 进制的 11。c或C对应 10 进制的 12。d或D对应 10 进制的 13。e或E对应 10 进制的 14。f或F对应 10 进制的 15。
示例与转换
| 16进制表示 | 10进制等价值 | 说明 |
|---|---|---|
0x0 |
0 | |
0x1 |
1 | |
0x9 |
9 | |
0xA |
10 | A 代表 10 |
0xF |
15 | F 代表 15 |
0x10 |
16 | 1 * 16^1 + 0 * 16^0 = 16 + 0 = 16 |
0xFF |
255 | 15 * 16^1 + 15 * 16^0 = 240 + 15 = 255 |
0x1A |
26 | 1 * 16^1 + 10 * 16^0 = 16 + 10 = 26 |
代码示例
#include <stdio.h>
int main() {
// 定义几个16进制数
int hex1 = 0x1A; // 等于 10 进制的 26
int hex2 = 0xFF; // 等于 10 进制的 255
int hex3 = 0x100; // 等于 10 进制的 256
// 使用 printf 的 %x 或 %X 格式说明符来以16进制形式输出
// %x: 输出小写字母 a-f
// %X: 输出大写字母 A-F
// %0x 或 %0X: 输出时不足8位(对于int)前面补0
printf("hex1 (10进制): %d\n", hex1); // 输出: 26
printf("hex1 (16进制): %x\n", hex1); // 输出: 1a
printf("hex2 (10进制): %d\n", hex2); // 输出: 255
printf("hex2 (16进制): %X\n", hex2); // 输出: FF
printf("hex3 (16进制, 补零): %08X\n", hex3); // 输出: 00000100 (在32位系统上)
// 编译器在内部统一处理,无论你是写 26, 0x1A 还是 032 (8进制),只要值一样,变量存储的就是同一个数
int num1 = 26;
int num2 = 0x1A;
int num3 = 032; // 8进制表示
if (num1 == num2 && num2 == num3) {
printf("26, 0x1A, 和 032 是相等的,\n");
}
return 0;
}
(c) 16进制相关的运算符
“16进制相关的运算符” 这个说法本身不严谨,因为 C 语言的运算符(如 , , &, )是作用于值的,而不是作用于进制的,一个 16 进制数 0xFF 和一个 10 进制数 255 在内存中存储的值是完全一样的,因此对它们进行的任何运算结果也完全一样。
通常指的是 “如何使用位运算符来操作 16 进制数,尤其是在处理颜色、寄存器配置等场景时”。
位运算符
位运算符直接对整数的二进制位进行操作,使用 16 进制来表示这些数非常直观,因为每个 16 进制位正好对应 4 个二进制位(一个 nibble)。
&(按位与)- (按位或)
^(按位异或)- (按位取反)
<<(左移)>>(右移)
经典应用场景:提取颜色分量
假设一个 32 位的颜色值,用 16 进制表示为 0xAARRGGBB。

(图片来源网络,侵删)
AA是 Alpha 通道(透明度)RR是 Red 通道(红色)GG是 Green 通道(绿色)BB是 Blue 通道(蓝色)
现在我们有一个颜色 0xFF5733 (这是一个橙色)。
#include <stdio.h>
int main() {
unsigned int color = 0xFF5733; // 32位颜色值
// 目标:分别提取出 R, G, B 三个分量的值
// 1. 提取红色分量 (0xFF)
// 思路:将其他位置的位都清零,只保留红色部分。
// 红色分量在最左边8位,我们可以用 & 运算,并配合一个“掩码”(mask) 0xFF0000。
// 0xFF0000 的二进制是 1111 1111 0000 0000 0000 0000
unsigned int red = (color & 0xFF0000) >> 16;
printf("Red: %u (0x%X)\n", red, red); // 输出: Red: 255 (0xFF)
// 2. 提取绿色分量 (0x57)
// 思路:同样用 & 运算,掩码是 0x00FF00。
// 0x00FF00 的二进制是 0000 0000 1111 1111 0000 0000
unsigned int green = (color & 0x00FF00) >> 8;
printf("Green: %u (0x%X)\n", green, green); // 输出: Green: 87 (0x57)
// 3. 提取蓝色分量 (0x33)
// 思路:掩码是 0x0000FF。
// 0x0000FF 的二进制是 0000 0000 0000 0000 1111 1111
unsigned int blue = color & 0x0000FF;
printf("Blue: %u (0x%X)\n", blue, blue); // 输出: Blue: 51 (0x33)
// 4. 组合颜色分量
// 思路:使用 | 运算,将各个分量移动到正确的位置上,然后组合起来。
unsigned int new_color = (red << 16) | (green << 8) | blue;
printf("New combined color: 0x%X\n", new_color); // 输出: 0xFF5733
return 0;
}
赋值运算符
&=, , ^=, <<=, >>= 是复合赋值运算符,它们将运算和赋值结合在一起,使代码更简洁。
int flags = 0x00; // 初始状态
// 设置第1位 (值为 0x01)
flags |= 0x01; // 等价于 flags = flags | 0x01;
printf("Flags after setting bit 1: 0x%X\n", flags); // 输出: 0x1
// 设置第3位 (值为 0x04)
flags |= 0x04;
printf("Flags after setting bit 3: 0x%X\n", flags); // 输出: 0x5
// 清除第1位
flags &= ~0x01; // ~0x01 是对 0x01 按位取反,得到 0xFFFFFFFE (在32位系统上)
// 然后和 flags 做 & 运算,就能把第1位清零
printf("Flags after clearing bit 1: 0x%X\n", flags); // 输出: 0x4
- (b) 16进制表示:在 C 语言中,通过在数字前加
0x或0X来表示 16 进制整数,如0xFF,这是为了方便程序员直接使用 16 进制值,常用于内存地址、颜色码、位掩码等场景。 - (c) 16进制运算:这实际上是指对以16进制形式书写的数值进行运算,核心是位运算符 (
&, ,<<等),因为 16 进制与二进制的对应关系非常清晰,使得位操作变得直观和方便,它不是一种特殊的“16进制运算”,而是利用16进制的可读性来执行底层的位操作。

(图片来源网络,侵删)
