代码之家  ›  专栏  ›  技术社区  ›  charelf

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

  •  -1
  • charelf  · 技术社区  · 6 年前

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

    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非常陌生,这可能是一个明显的错误。

    1 回复  |  直到 6 年前
        1
  •  3
  •   M.M    6 年前

    关于共同制度 int 是一种32位类型,其最大值为 0x7FFFFFFF . 你的价值 0x88555680 超出了您的使用范围 . 编译器应该警告您这一点;如果您没有看到警告,那么我建议调整编译器设置。

    您的代码还通过使用 %x 打印 int %x 说明符只能用于 unsigned int .

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