当前位置: 首页 > 知识库问答 >
问题:

为什么在使用int32_t循环变量时for循环不停止?

冯亮
2023-03-14

在我的程序中,我发现当Iint32_t时,循环无法正确退出。它看起来像整数溢出,远远大于10,循环不会停止。请告诉我发生了什么,以及如何在大型项目中避免这个错误。

#include <iostream>
#include <stdint.h>
int f(int n){

    for (int32_t i = 0; i < 10; ++i)
    {
        int64_t time = 4500000000 +  (i) * 500000000;
        std::cout << time<< " i: " << i << std::endl;

    }
    return 0;
}

int main ()
{
    return f(10);
}

代码链接

共有1个答案

薛烨霖
2023-03-14

如果您使用GCC 11.2.0和-Wall-O2选项,您将看到有关未定义行为的警告:

test.cpp: In function 'int f(int)':
test.cpp:7:42: warning: iteration 5 invokes undefined behavior [-Waggressive-loop-optimizations]
    7 |         int64_t time = 4500000000 +  (i) * 500000000;
      |                                      ~~~~^~~~~~~~~~~
test.cpp:5:27: note: within this loop
    5 |     for (int32_t i = 0; i < 10; ++i)
      |                         ~~^~~~

编译器知道5*500000000太大,无法放入int(通常为32位)中。有符号整数溢出是C语言中未定义的行为。因此,编译器可以自由地假设这个溢出永远不会发生,因此它将假设i永远不会达到10,因此它可以去掉for循环中检查i的部分

只需添加一些转换来指定您要执行64位算术。这消除了警告、溢出和未定义的行为:

int64_t time = (int64_t)4500000000 + i * (int64_t)500000000;

 类似资料:
  • 在我的程序中,我发现当为时,循环无法正确退出。它看起来像整数溢出,远远大于10,循环不会停止。请告诉我发生了什么,以及如何在大型项目中避免这个错误。 代码链接

  • 问题内容: 我也在学习Java和android。我们可以在while循环中执行的几乎所有事情都可以在while循环中执行。 我发现一个简单的条件,使用while循环比for循环更好 如果我必须在程序中使用counter的值,那么我认为while循环要比for循环好 使用while循环 在这种情况下,我发现while循环要比for循环好,因为如果要在for循环中实现相同的效果,则必须将counter

  • 问题内容: 我一直在使用“ if”来测试自己的版本,并且一切似乎都正常。当然,如果使用signalAll()而不是signal(),这将导致严重崩溃,但是如果一次仅通知一个线程,这怎么会出错? 他们的代码在这里 -检查put()和take()方法;在Condition的JavaDoc顶部可以看到一个更简单,更重点的实现。 下面是我实施的相关部分。 PS我知道,通常,尤其是在这样的lib类中,应该让

  • 我需要构造一组变量,其中变量应基于2部分构造:a)name b)一个用value[1]加强的数字。对于不断增加的数字,我使用了for循环。我设法创建了一个字符串,参见test1,但没有增加变量名称,参见test2。 鉴于下面提供的错误代码,我假设R不希望我使用变量名中的“paste0”来构造某些东西。 我的R代码: “测试1”的结果: 我得到的test2错误是: “test2”的预期结果是:

  • 我的代码是: 这似乎不会在我的变量列表中循环。有什么想法吗?提前致谢

  • 问题内容: 这是代码- 这是输出- 0 0 1 2 3 4 5 6 7 8 当我想在for循环退出后使用变量i时,出现了我的问题。我会假设我正在读取7,即从零开始的计数中的第8个增量,但实际上是8!在循环退出时对变量i又增加了一个增量。 为了解决这个问题,我必须在循环的末尾以及在其他任何代码中使用它之前,先执行类似i的操作。在我看来,这使代码更难理解。 有更好的解决方案吗? 问题答案: 当值为7时