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

C output of hexadecimal division different from all other sources

我想除以两个十六进制数:

例如: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 的新手,这可能是一个明显的错误。

在普通系统上int是一个32位的类型,其最大值是0x7FFFFFFF。您的 0x88555680 值超出了 int 的范围。编译器应该警告你这一点;如果您没有看到警告,那么我建议您调整编译器设置。

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

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