C当printf转换long long到%o(unsigned int)时发生了什么

时间:2015-03-03 23:16:52

标签: c casting printf variadic-functions

我正在尝试复制printf因为我不允许在作业中使用真正的作品,而且当我传递的值太大时我不明白发生了什么:

unsigned int n = 4294967286;
printf("%o", n); #=> 37777777766
my_printf("%o", n); #=> 4256507006;

我得到了这样的价值:

a = (unsigned int)(va_arg(f->l, unsigned int));

然后我使用我的ui_to_s来获取相应的字符串:

char *ui_to_s_base(unsigned long long n, int base, const char *base_set)
{
    const char  *defaut_base = "0123456789abcdef";
    char        *res;
    char        *tmp;
    unsigned long long   i;

    tmp = str_new_size(256);
    i = 0;
    tmp[i++] = base_set ? base_set[(n % base)] : defaut_base[(n % base)];
    while ((n /= 10) > 0)
        tmp[i++] = base_set ? base_set[(n % base)] : defaut_base[(n % base)];
    tmp[i] = '\0';
    res = str_reverse(tmp);
    free(tmp);
    return (res);
}

我做错了吗?

1 个答案:

答案 0 :(得分:2)

while ((n /= 10) > 0)

你应该除以base。只要您要求它以十进制打印,10就会像魅力一样工作。

我想这里的故事的寓意是,如果你的某些代码中有一个包含非平凡常数的错误,那么这可能是开始调查的好地方。