C整数溢出
作者:互联网
我刚刚开始自学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;
}
这是输出:
0
2147483647
-2147483648
0
4294967295
0
输出让我感到有些惊讶,我想知道是否有人可以解释为什么会发生这种情况,或者如果这些结果出乎意料的预期;所以这可能只是我特定机器的结果.
解决方法:
整数(通常)采用32位表示.如果您有32位,则可以从0到231-1寻址.即,
00000000000000000000000000000000
00000000000000000000000000000001
.
.
.
01111111111111111111111111111111
^-------------------------------
signed bit
0表示正数,1表示负数.
如果将1添加到01111111111111111111111111111111,则会得到10000000000000000000000000000000,即十进制的-2147483648.
使用无符号整数,没有符号位,事实上,它的数字可能是最大有符号整数的两倍.但是,当数字再次翻转时(即11111111111111111111111111111111 00000000000000000000000000000001),您只需回滚到00000000000000000000000000000000.
为了更深入地理解,您可以查看two’s complement,这是整数在计算机中的表示方式.
标签:c,integer-overflow 来源: https://codeday.me/bug/20191007/1866801.html