十六进制除法的 C 输出不同于所有其他来源
C output of hexadecimal division different from all other sources
我想除以两个十六进制数:
例如: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 的新手,这可能是一个明显的错误。
在普通系统上int
是一个32位的类型,其最大值是0x7FFFFFFF
。您的 0x88555680
值超出了 int
的范围。编译器应该警告你这一点;如果您没有看到警告,那么我建议您调整编译器设置。
此外,您的代码使用 %x
打印 int
会导致未定义的行为。 %x
说明符只能用于 unsigned int
.
要在这种情况下修复您的代码,请对所有 3 个变量使用 unsigned int
而不是 int
。如果要处理更大的数字,可以使用 unsigned long long
或 uint64_t
。 (在这些情况下,您还需要更新 printf 格式说明符)。
我想除以两个十六进制数:
例如: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 的新手,这可能是一个明显的错误。
在普通系统上int
是一个32位的类型,其最大值是0x7FFFFFFF
。您的 0x88555680
值超出了 int
的范围。编译器应该警告你这一点;如果您没有看到警告,那么我建议您调整编译器设置。
此外,您的代码使用 %x
打印 int
会导致未定义的行为。 %x
说明符只能用于 unsigned int
.
要在这种情况下修复您的代码,请对所有 3 个变量使用 unsigned int
而不是 int
。如果要处理更大的数字,可以使用 unsigned long long
或 uint64_t
。 (在这些情况下,您还需要更新 printf 格式说明符)。