什么是C中的算术下溢和上溢?

问题描述

| C语言编程中的算术下溢和溢出是什么意思?     

解决方法

        溢出 从http://en.wikipedia.org/wiki/Arithmetic_overflow:   当   计算产生的结果是   幅度大于   给定的寄存器或存储位置可以   存储或代表。 因此,例如:
uint32_t x = 1UL << 31;
x *= 2;  // Overflow!
请注意,正如@R在下面的评论中提到的,C标准建议:   涉及无符号的计算   操作数永远不会溢出,因为   无法代表的结果   结果无符号整数类型是   减少模数为一   大于最大值   可以用结果表示   类型。 当然,这是\“ overflow \”的相当特质的定义。大多数人会将模减少(即环绕)称为“溢出”。 下溢 从http://en.wikipedia.org/wiki/Arithmetic_underflow:   计算机程序中的条件   可能会在   浮点运算在   大小(即接近零)   比可表示的最小值   作为一个普通的浮点数   目标数据类型。 因此,例如:
float x = 1e-30;
x /= 1e20; // Underflow!
    ,        计算机仅使用0和1表示数据,因此可以表示的值范围受到限制。许多计算机使用32位存储整数,因此在这种情况下可以存储的最大无符号整数是2 ^ 32 -1 =4294967295。但是第一位用于表示符号,因此,实际上,最大值是2 ^ 31-1 = 2147483647。 超出允许范围的整数需要比存储的位数更多的位的情况称为溢出。 类似地,对于实数,指数太小而无法存储会导致下溢。     ,        int是C语言中最常见的数据类型,是32位数据类型。这意味着每个in​​t在内存中被赋予32位。如果我有变量
int a = 2;
实际上会在内存中以32位二进制数表示: 00000000000000000000000000000010。 如果您有两个二进制数,例如 10000000000000000000000000000000 和 10000000000000000000000000000000, 它们的总和为100000000000000000000000000000000000000,即33位长。但是,计算机仅采用32个最低有效位,全为0。在这种情况下,计算机识别出总和大于32位中可以存储的总和,并产生溢出错误。 下溢基本上是在相反方向上发生的同一件事。用于C的浮点标准允许小数点后23位;如果数字的精度超出此点,它将无法存储这些位。这导致下溢错误和/或精度损失。     ,        下溢仅取决于给定的算法和给定的输入数据,因此程序员无法直接控制。另一方面,上溢取决于程序员为每个堆栈保留的存储空间量的任意选择,并且此选择确实会影响溢出发生的次数     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...