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