首页 > 后端开发 > C++ > 为什么整数溢出会在 C 中产生意外结果?

为什么整数溢出会在 C 中产生意外结果?

DDD
发布: 2024-11-12 16:47:01
原创
231 人浏览过

Why Does Integer Overflow Produce Unexpected Results in 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
登录后复制

有符号整数溢出

有符号整数溢出是未定义的行为。这意味着编译器可以做任何它想做的事情,包括产生像本例一样的错误结果。

无符号整数溢出

相比之下,无符号整数溢出很好-定义。该值环绕,类似于除以 2^bits 的模数(其中,bits 是数据类型中的位数)。由于我们有一个 32 位 int:

4294967295 + 1 = 4294967296 % 2^32 = 0
登录后复制

具体实现细节

尽管有符号整数溢出是未定义的行为,但大多数实现都使用 2 的补码表示。这解释了在该程序中观察到的具体结果:

  • POS_MAX(最大正值)= 7 (0111)
  • NEG_MAX(最大负值)= -8 (1000)

加 1 时POS_MAX:

0111 + 1 = 1000
登录后复制

由于设置了前导位,因此它是一个负数。为了找到实际值,我们执行 2 的补码逆:

1000 - 1 = 0111
~0111 = 1000 = -8
登录后复制

因此,最终值为 -8,出现在程序的输出中。

以上是为什么整数溢出会在 C 中产生意外结果?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板