我刚刚开始自学C++,并开始学习整数溢出.出于好奇,我写了一些测试,只是为了看看某些整数值会发生什么.
这是我的计划:
#include <iostream>
int main()
{
int x(0);
std::cout << x << std::endl;
x = x + 2147483647;
std::cout << x << std::endl;
x = x + 1;
std::cout << x << std::endl;
std::cout << std::endl;
unsigned int y(0);
std::cout << y << std::endl;
y = y + 4294967295;
std::cout << y << std::endl;
y = y + 1;
std::cout << y << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
0
2147483647
-2147483648
0
4294967295
0
Run Code Online (Sandbox Code Playgroud)
输出让我感到有些惊讶,我想知道是否有人可以解释为什么会发生这种情况,或者如果这些结果出乎意料的话,这是预期的; 所以这可能只是我特定机器的结果.
参考C11 草案,第 3.4.3 节和C11 草案,第 H.2.2 节,我正在寻找实现除有符号整数的模运算以外的行为的“C”实现。
具体来说,我正在寻找这是默认行为的实例,可能是由于底层机器架构。
这是一个代码示例和终端会话,说明了有符号整数的模算术行为:
overflow.c:
#include <stdio.h>
#include <limits.h>
int main(int argc, char *argv[])
{
int a, b;
printf ( "INT_MAX = %d\n", INT_MAX );
if ( argc == 2 && sscanf(argv[1], "%d,%d", &a, &b) == 2 ) {
int c = a + b;
printf ( "%d + %d = %d\n", a, b, c );
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
终端会话:
$ ./overflow 2000000000,2000000000
INT_MAX = 2147483647
2000000000 + 2000000000 …Run Code Online (Sandbox Code Playgroud)