C语言16 b c)指什么?

99ANYc3cd6
预计阅读时长 16 分钟
位置: 首页 C语言 正文
  1. (b) 16进制整数的表示
  2. (c) 16进制相关的运算符

(b) 16进制整数的表示

在 C 语言中,如果要在代码中直接写一个 16 进制(也叫“十六进制”)的整数,需要在数字前面加上前缀 0x0X

c语言 16 b c)
(图片来源网络,侵删)

语法

int number = 0x1A;  // 使用 0x 前缀
int number2 = 0XFF; // 使用 0X 前缀 (大写 X 也可以)

规则

  1. 前缀:必须以 0x0X 开头,告诉编译器这是一个 16 进制数。
  2. 有效字符:后面的部分只能包含 0-9a-f (或 A-F)。
    • 0-9 对应 10 进制的 0 到 9。
    • aA 对应 10 进制的 10。
    • bB 对应 10 进制的 11。
    • cC 对应 10 进制的 12。
    • dD 对应 10 进制的 13。
    • eE 对应 10 进制的 14。
    • fF 对应 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

c语言 16 b c)
(图片来源网络,侵删)
  • 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 语言中,通过在数字前加 0x0X 来表示 16 进制整数,如 0xFF,这是为了方便程序员直接使用 16 进制值,常用于内存地址、颜色码、位掩码等场景。
  • (c) 16进制运算:这实际上是指对以16进制形式书写的数值进行运算,核心是位运算符 (&, , << 等),因为 16 进制与二进制的对应关系非常清晰,使得位操作变得直观和方便,它不是一种特殊的“16进制运算”,而是利用16进制的可读性来执行底层的位操作。
c语言 16 b c)
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
C语言findpattern函数如何实现模式匹配?
« 上一篇 2025-12-20
韩顺平dede二次开发视频教程学什么?
下一篇 » 2025-12-20

相关文章

取消
微信二维码
支付宝二维码

目录[+]