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

自定义my_printf的%d格式符为何出现符号位置错误?

修复自定义my_printf中%d格式符的输出错误

问题分析

你当前的my_printf处理%d时存在两个核心错误:

  • 输入-1337时输出1337-,符号位被错误移到数字末尾
  • 存在INT_MIN溢出风险:当输入值为-2147483648时,执行value = -value会触发整数溢出,属于C语言未定义行为,导致后续数字处理完全失效

错误根源:

  1. 符号位与数字一同反转:处理负数时,你先将'-'写入buffer头部,再逆序存储数字各位,最后反转整个buffer,直接导致符号位被移到数字末尾。
  2. 未处理整数溢出:int类型的最小值INT_MIN取反后超出了int的最大值范围,会触发未定义行为。

修正后的代码

{
    int value = va_arg(args, int);
    char buffer[32];
    int index = 0;
    int is_negative = 0;
    unsigned int u_val;

    // 记录符号并处理绝对值,规避INT_MIN溢出问题
    if (value < 0) {
        is_negative = 1;
        u_val = (unsigned int)-value;
    } else {
        u_val = (unsigned int)value;
    }

    // 逆序存储数字各位
    if (u_val == 0) {
        buffer[index++] = '0';
    } else {
        while (u_val > 0) {
            buffer[index++] = '0' + (u_val % 10);
            u_val /= 10;
        }
    }

    // 仅反转数字部分,不触动符号位
    for (int i = 0; i < index / 2; i++) {
        char temp = buffer[i];
        buffer[i] = buffer[index - i - 1];
        buffer[index - i - 1] = temp;
    }

    // 若为负数,将负号插入buffer头部
    if (is_negative) {
        // 所有数字后移一位,腾出头部位置
        for (int i = index; i > 0; i--) {
            buffer[i] = buffer[i - 1];
        }
        buffer[0] = '-';
        index++;
    }

    write(1, buffer, index);
    size += index;
    break;
}

关键改动说明

  • 用unsigned int存储绝对值:彻底避免INT_MIN取反时的溢出问题,确保所有负数的绝对值都能正确处理。
  • 分离符号位与数字处理:先完成数字的逆序存储与反转,再将负号插入buffer头部,从根源上避免符号位被反转。
  • 明确反转范围:仅对数字部分执行反转操作,保证符号位始终处于正确的头部位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:35:28