我要除以两个十六进制数字:
例如: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);
}
输出:
a88555680, b10000, cffff8856
在C语言中,我找到 8856 ,而在使用Python和在线计算器的情况下,我找到 8855
问题:为什么C输出不是8855?为什么是8856?应该不是8855.something,然后将其截断为0,即8855吗?
我是C语言的新手,这可能是一个明显的错误。
答案 0 :(得分:3)
在常见系统上,int
是32位类型,最大值为0x7FFFFFFF
。您的0x88555680
值超出了int
的范围。编译器应对此发出警告;如果您没有看到警告,则建议调整编译器设置。
另外,您的代码通过使用%x
打印int
导致未定义的行为。 %x
说明符只能用于unsigned int
。
在这种情况下,要修复代码,请对所有3个变量使用unsigned int
而不是int
。如果要处理更大的数字,可以使用unsigned long long
或uint64_t
。 (在这种情况下,您还需要更新printf格式说明符。)