C语言为什么会发?数据溢出?如何避免数据溢出?

发布时间:2024年01月16日

一、问题

有以下程序:

#include <stdio.h>
int main()
{
    int i, sum; /*声明变量 */
    i = 2147483647; /*定义变量*/
    sum = i + 1; /*变量值加1*/
    printf("%d,%d", i, sum); /*输出结果*/
    return 0;
}

运?后 sum 的结果是什么?

二、解答

1、分析

????????按正常的计算,sum 应该是2147483648,但是运?后 sum 的结果是-2147483648。这是什么原因呢?

????????在C语?中可以使?各种类型的标识符,但是C语?标准?并没有规定这些类型的具体?度,要由各个C编译系统??规定。?般以?个机器字存放?个 int 数据,早期的计算机字??般为16 位,故以16 位存放?个整数,整数的范围在-32768~32767 之间,整数范围太?,在使?的时候就容易产?溢出现象。

????????在这段代码中,变量i被初始化为2147483647,这是一个int类型的最大值。当执行i+1时,由于int类型的取值范围是-2147483648到2147483647,因此i+1会产生溢出,结果不是预期的2147483648,而是-2147483648。

????????但现代的计算机?般都为32 位以上,以 32 位存放?个整数,范围可达±2.1×10^9,所以当前?般将 int 和 long 都定义为32 位。在写程序时,要了解所?系统对标识符长度的规定,以免出现上?的错误。

????????如果真的产?“溢出”,运?时也不会报错,?是将结果从“头”开始计算,即是上?的运?结果-327682147483648,这与编程者的原意不同。由于系统不会给出“出错信息”,所以要靠程序员的细?和经验来进?排错。

说明:
    当前?多编译器多将 int 规定为32?位,所以?般不会出现“溢出”现象。

2、解决?法

将数据定义为?整型long 类型,在输出的时候使?“%ld”即可。

注意:
    long 型数据可以得到?范围的整数,但同时会降低运算速度。因此,除?不得已,否则不要随便
使? long 型。

三、总结

????????C语?数值数据类型都有?个取值范围。在进?数值运算的时候,有时会因数值超出了定义类型的取值范围?产?溢出的情况。所以在表?数据时,应根据需要选择适当的数据类型。

文章来源:https://blog.csdn.net/W_Fe5/article/details/135620805
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。