gpt4 book ai didi

C 64 位左移失败

转载 作者:太空狗 更新时间:2023-10-29 16:58:33 30 4
gpt4 key购买 nike

我有这段 C 代码(仅供学习):

    char x;
uint64_t total = 0;

for(x = 20; x < 30; x++){
total = (((((1 << x) * x) / 64) + 1) * sizeof(uint64_t));
printf("%d - %llu\n", x, total);
}

打印的内容:

20 - 2621448
21 - 5505032
22 - 11534344
23 - 24117256
24 - 50331656
25 - 104857608
26 - 218103816
27 - 18446744073625665544
28 - 18446744073575333896
29 - 18446744073508225032

为什么在 x > 26 时我有那些奇怪的值?我在 Ubuntu 10.10 64 位上使用 gcc 4.6.1。

最佳答案

因为 1是一个 int , 32 位,所以 (1 << 27)*27溢出。使用 1ull .

关于您的评论,如果 xuint64_t , 然后 1 << x仍然是 int , 但对于乘法,它将被转换为 uint64_t ,所以不会溢出。但是,如果 x >= 31 , 1 << x将是未定义的行为(因为结果值不能用带符号的 32 位整数类型表示)。

关于C 64 位左移失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10048047/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com