C++数据溢出(上溢和下溢)

C++数据溢出(上溢和下溢),第1张

概述当变量的数据类型所提供的位数无法适应某个值时,就会发生 溢出上溢) 或 下溢 。 就像往水桶里装水,水满则溢,变量也是这样,如果要存储的值超过了变量所能提供的位数,就 当变量的数据类型所提供的位数无法适应某个值时,就会发生溢出(上溢)下溢就像往水桶里装水,水满则溢,变量也是这样,如果要存储的值超过了变量所能提供的位数,就会出现问题。

不妨来看一个例子,假设在一个使用了 2 个字节内存的 short int 类型变量中存储了以下值:

 这是 32 767 的二进制表示,也是能存储在该数据类型中的最大值。这里先不讲负数如何存储的细节,只要知道 short int 数据类型既可以存储正数也可以存储负数就可以了。高阶位(即最左侧位)是 0 的数字被解释为正数,高阶位为 1 的数字则被解释为负数。

如果上面示例中存储的数字加 1,则该变量将变成以下位模式:

但这不是 32 768。相反,它被解释为负数,所以这不是预期的结果。二进制 1 已经“流入”到高阶位的位置,这就是所谓的溢出(上溢)。

同样地,当一个整数变量保存的数值在其数据类型负值范围的最远端(即最小负值),那么当它被减去 1 时,其高位中的 1 将变为 0,结果数将被解释为正数。这是溢出的另一个例子。

除了溢出以外,浮点值还会遇到下溢的情况。当一个值太接近于零时,就可能会发生这种问题,过小的数字需要更多数位的精度来表示它,因而无法存储在保存它的变量中。

下面的程序演示了溢出和下溢:
// This program demonstrates overflow and underflow.#include <iostream>using namespace std;int main(){    // Set intvar to the maximum value a short int can hold short    short intvar = 32767;    // Set floatVar to a number too small to fit in a float float    float floatVar = 3.OE-47;    // display intvar    cout << "Original value of intvar " << intvar << endl;    // Add 1 to intvar to make it overflow    intvar = intvar + 1;    cout << "intvar after overflow " << intvar << endl;    // Subtract 1 from intvar to make it overflow again    intvar = intvar - 1;    cout << "intvar after 2nd overflow " << intvar << endl;    // display floatVar    cout << "Value of very tiny floatVar ” << floatVar;    return 0;}
程序输出结果:

Original value of intvar 32767
intvar after overflow    -32768
intvar after 2nd overflow 32767
Value of very tiny floatVar 0

尽管某些系统在出现溢出或下溢时会显示错误信息,但大多数情况下是不会显示的。该变量现在只是保存了不正确的值,而程序还是会继续运行。因此,为每个需要存储值的变量选择恰当的数据类型使其具有足够的位来保存值是非常重要的。
总结

以上是内存溢出为你收集整理的C++数据溢出(上溢和下溢)全部内容,希望文章能够帮你解决C++数据溢出(上溢和下溢)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1231365.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存