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

C十六进制除法的输出与所有其他源不同,c,hex,division,integer-division,C,Hex,Division,Integer Division,我想除以两个十六进制数: 例如:88555680/10000 现在,通过在线十六进制计算器,我发现: 在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;

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

例如:
88555680/10000

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

在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);
}
在C语言中,我找到了8856,而在Python和在线计算器中,我找到了8855

问题:为什么C输出不是8855?为什么是8856?它不应该是8855.something,然后向0截断,因此是8855吗


我对C非常陌生,这可能是一个明显的错误。

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

您的代码还通过使用
%x
打印
int
来导致未定义的行为。
%x
说明符只能用于
无符号int


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

因为
0x88555680
不适合签名
int
。检查一下这个:初级C编程书的第一章应该提到
int
的数值限制。
a88555680, b10000, cffff8856