C语言中如何将8字节整数拆分为四个2字节十六进制值
实现思路
- 核心通过位运算完成2字节段拆分:2字节对应16个二进制位,我们可以通过右移操作把目标段放到数值低16位,再和
0xFFFF(16位全1的掩码)做按位与,就能提取出对应段的数值,效率远高于字符串操作。 - 无需额外写十六进制转十进制的逻辑:拆分出的2字节无符号整数本身存储的就是原始数值,输出时指定不同的格式符就能分别显示十六进制、十进制形式,本质是同一个数值的不同展示方式。
完整示例代码
#include <stdio.h> int main() { unsigned long long input; printf("请输入一个非负的8字节整数: "); // %llu是unsigned long long类型的专属输入格式符 scanf("%llu", &input); // 从高到低拆分4个2字节段 unsigned short seg_high1 = (input >> 48) & 0xFFFF; // 最高位段:右移48位(16*3)后取低16位 unsigned short seg_high2 = (input >> 32) & 0xFFFF; // 次高位段:右移32位(16*2)后取低16位 unsigned short seg_low1 = (input >> 16) & 0xFFFF; // 次低位段:右移16位(16*1)后取低16位 unsigned short seg_low2 = input & 0xFFFF; // 最低位段:直接取低16位 // 结果输出 printf("\n拆分结果:\n"); printf("十六进制形式:%04x / %04x / %04x / %04x\n", seg_high1, seg_high2, seg_low1, seg_low2); printf("十进制数值:%u / %u / %u / %u\n", seg_high1, seg_high2, seg_low1, seg_low2); return 0; }
代码说明
- 输入变量用
unsigned long long类型,刚好占用8字节存储空间,符合非负输入的要求。 - 输出时用
%04x格式符可以直接输出4位补前导零的十六进制结果,用%u格式符输出就是对应段的十进制数值。 - 如果你需要调整段的顺序,只需要调换输出时四个段变量的顺序即可。
测试效果
输入示例中的最大值18446744073709551615时,输出结果如下:
十六进制形式:ffff / ffff / ffff / ffff
十进制数值:65535 / 65535 / 65535 / 65535
内容的提问来源于stack exchange,提问作者Rabbit_KIm
相关产品推荐
相关产品推荐

