其他分享
首页 > 其他分享> > C整数溢出

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