1、C_C++程序中怎样防止或判断数值计算的溢出问题
- 将程序中的数值计算变量都使用浮点型变量,浮点变量表示数值范围大,精度高,不易出现数据溢出,即使出现数据溢出,也比较好判断,浮点数溢出分为向上溢出、向下溢出;向上溢出:即数据太大,当前变量类型无法存储,这时C语言返回一个表示无穷大的特殊值,如:INF或INFINITY类型;向下溢出:即数据太小,当前变量类型无法表示这么小的精度,这时数据会向右移动,前面补0,这样会损失有效位数。
- 整数型变量表示范围小,并且出现溢出后,会从起始数开始计数,所以不易判断整数是否溢出。
- 浮点型数值溢出判断:
- 使用函数
_finite(var)
判断数值变量var
是否溢出,溢出返回0,没有溢出则返回1; - 通过数值比较来判断是否溢出,
<float.h>
头文件中定义了float、double型数值
能表示的最大最小值宏定义:
float型: FLT_MAX, FLT_MIN
double型: DBL_MAX, DBL_MIN
通过将浮点型变量var
与上面的最大最小值宏定义比较,就能知道是否溢出,如果浮点型数值向上溢出,最好是将该变量取值为FLT_MAX 或 DBL_MAX
,即取浮点型数值的最大值,代码示例如下所示:
#include<stdio.h>
#include<float.h>
int main()
{
float num = 3.4E38 * 100.0f; // num变量溢出
if(_finite(num)) //采用_finite()函数判断是否溢出
printf("the number is too big!\n");
num = num > FLT_MAX? FLT_MAX:num; //先通过数值比较来判断是否溢出,溢出则取最大值
return 0;
}
2、C_C++程序中单双引号字符混淆问题
- 双引号:
"string"
表示字符串,字符串是一个char型指针;单引号:'c'
表示一个字符,不要将"c"与'c'混淆。 - 输入字符判断代码:
if (getchar() == 'c') //判断输入字符是否为'c',字符(ASCII)可以直接和int型比较