十六进制除法的C输出不同于所有其他源

时间:2018-12-12 21:08:39

标签: c hex division integer-division

我要除以两个十六进制数字:

例如:88555680/10000

现在,通过在线十六进制计算器,我发现:

8855 as result here

8855.568 as result here

在python中,我发现:

>>> hex(int("0x88555680",16)//int("0x10000", 16))
'0x8855'

这是我的C代码:

# include <stdio.h>

int main()  {
    int a = 0x88555680;
    int b = 0x10000;
    int c = a/b;
    printf("a%x, b%x, c%x\n", a, b, c);
}

输出:

a88555680, b10000, cffff8856

在C语言中,我找到 8856 ,而在使用Python和在线计算器的情况下,我找到 8855

问题:为什么C输出不是8855?为什么是8856?应该不是8855.something,然后将其截断为0,即8855吗?

我是C语言的新手,这可能是一个明显的错误。

1 个答案:

答案 0 :(得分:3)

在常见系统上,int是32位类型,最大值为0x7FFFFFFF。您的0x88555680值超出了int的范围。编译器应对此发出警告;如果您没有看到警告,则建议调整编译器设置。

另外,您的代码通过使用%x打印int导致未定义的行为。 %x说明符只能用于unsigned int

在这种情况下,要修复代码,请对所有3个变量使用unsigned int而不是int。如果要处理更大的数字,可以使用unsigned long longuint64_t。 (在这种情况下,您还需要更新printf格式说明符。)