我只是想知道整数溢出到底有多可怕。以下面的示例程序为例:
#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)如果在计算表达式期间,结果未在数学上定义或不在其类型的可表示值范围内,则行为未定义。
(§3.9.1/4)声明的无符号整数
unsigned
应遵守算术模 2^n 的定律,其中 n 是该特定整数大小的值表示中的位数。这意味着无符号算术不会溢出,因为不能由得到的无符号整数类型表示的结果会以比得到的无符号整数类型可以表示的最大值大一的数字为模减少。