gpt4 book ai didi

c++ - C++中的整数溢出有多灾难性?

转载 作者:IT老高 更新时间:2023-10-28 21:40:08 32 4
gpt4 key购买 nike

我只是想知道整数溢出到底有多可怕。以下面的示例程序为例:

#include <iostream>

int main()
{
int a = 46341;
int b = a * a;
std::cout << "hello world\n";
}

由于 a * a 在 32 位平台上溢出,并且整数溢出会触发未定义的行为,我是否有任何保证 hello world 将实际出现在我的屏幕上?


我根据以下标准引号从我的问题中删除了“签名”部分:

(§5/5 C++03, §5/4 C++11) If during the evaluation of an expression, the result is not mathematically defined or not in the range of representable values for its type, the behavior is undefined.

(§3.9.1/4) Unsigned integers, declared unsigned, shall obey the laws of arithmetic modulo 2^n where n is the number of bits in the value representation of that particular size of integer. This implies that unsigned arithmetic does not overflow because a result that cannot be represented by the resulting unsigned integer type is reduced modulo the number that is one greater than the largest value that can be represented by the resulting unsigned integer type.

最佳答案

正如@Xeo 在评论中指出的那样(我实际上是在 C++ chat 中首先提出的):
未定义的行为确实意味着它,它会在你最意想不到的时候打击你。

最好的例子在这里:Why does integer overflow on x86 with GCC cause an infinite loop?

在 x86 上,有符号整数溢出只是一个简单的环绕。所以通常情况下,您会期望在 C 或 C++ 中发生同样的事情。但是,编译器可以进行干预 - 并使用未定义的行为作为优化的机会

在取自该问题的示例中:

#include <iostream>
using namespace std;

int main(){
int i = 0x10000000;

int c = 0;
do{
c++;
i += i;
cout << i << endl;
}while (i > 0);

cout << c << endl;
return 0;
}

使用 GCC 编译时,GCC 会优化循环测试并使其成为无限循环。

关于c++ - C++中的整数溢出有多灾难性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9024826/

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