You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言十进制转十六进制取低四位:返回字符串与函数内不符排查

问题分析与解决方案

咱们先拆解你代码里的几个核心问题,就能明白为什么主函数拿不到正确结果,还会出现x1≠x2的情况:

1. 局部指针修改不影响原数组地址

你在函数里对x执行x++操作时,修改的只是函数内部的指针副本,主函数里传入的原数组指针根本没变化。举个例子:主函数里的x指向数组首地址0x1000,函数里的x是这个地址的拷贝,你把函数里的x移到0x1004,主函数的x还是指向0x1000,所以主函数看到的永远是sprintf最初写入的完整字符串。

2. 多余的换行符打乱长度判断

你用了sprintf(x, "%04X\n", num),这里的\n会在字符串末尾多占一个字符。比如原本四位十六进制字符串长度是4,加了换行后变成5,直接触发size>4的判断逻辑,导致指针被错误移动。

3. 字符串截断逻辑完全错误

就算指针问题解决了,你现在的逻辑是从字符串开头往后截断到4位,但我们需要的是低四位十六进制数字(也就是数值的低16位),比如0x12345678的低四位是5678,而不是前四位1234。靠移动指针截断字符串的方式,完全搞反了截取方向。


修正后的代码

正确的思路应该是先把数值的低16位(对应四位十六进制)掩码出来,再直接格式化输出,根本不需要处理字符串截断:

#include <stdio.h>
#include <string.h>

char* dec_to_hex_converter(int num, char x[]) {
    // 用掩码取出低16位,确保只保留四位十六进制对应的数值
    int low_16bits = num & 0xFFFF;
    // 格式化输出为4位大写十六进制,自动补前导0,不要加换行符
    sprintf(x, "%04X", low_16bits);
    // 返回原数组指针,和主函数传入的地址一致
    return x;
}

// 主函数调用示例
int main() {
    char hex_buf[10];
    int test_nums[] = {0x1234, 0x12345678, 0xABC, 0xFFFF};
    
    for (int i = 0; i < 4; i++) {
        dec_to_hex_converter(test_nums[i], hex_buf);
        printf("0x%X → %s\n", test_nums[i], hex_buf);
    }
    return 0;
}

运行结果:

0x1234 → 1234
0x12345678 → 5678
0xABC → 0ABC
0xFFFF → FFFF

为什么之前会出现x1≠x2?

主函数里的x1是你传入的数组首地址,而函数返回的x是被你移动后的指针(比如原数组首地址+5),这两个指针指向数组的不同位置,自然不相等。修正后我们返回原数组指针,就能保证主函数拿到的地址和函数返回值一致。

内容的提问来源于stack exchange,提问作者shaked

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:20:52