防止数据类型变量产生回绕与溢出
产生以上大部分问题的原因主要是:
1.不同数据类型的算术操作,产生了回绕与溢出。
2.不同数据类型的逻辑运算操作,产生了回绕与溢出。
3.存储的数据大小超过了数据类型的最大值或最小值,产生了溢出和回绕。
一、显示地指出某个变量是signed char类型还是unsigned char来执行算数运算
由于不同编译器对char类型的变量定义不同,有可能是signed char,也有可能是unsigned char,所以,只有我们显示地指定数据类型,才能得到唯一的结果。
二、使用size_t类型表示一个对象所占用空间的整数值单位(内存大小)
size_t的引入增强了程序在不同平台上的可移植性,可以作为大小、索引、循环计数和长度的整数值。但是,在进行循环索引的时候,要注意size_t的大小
int i;
size_t n;
for(i=0;i<n;i++)
{
//循环体
}
在上述代码中,定义了一个整形变量i,一个size_t变量n,一般size_t变量的数据范围会比int类型大(>INT_MAX),那么i在循环时,有可能会超出INT_MAX,而产生回绕。这里就出现了一个BUG。避免这种BUG的方法就是统一 i 和 n 的数据类型大小,即 i 的范围要大于 n的范围。
三、禁止把size_t类型和它所代表的真实类型混用
因为不同的平台对size_t的定义不同,若与其所代表的真实类型混用可能会在其它的平台报错。但size_t在每个平台都作为大小、索引、循环计数和长度的整数值,都是一个范围很大的数。
四、小心使用无符号类型带来的陷阱
当有符号整型和无符号整型进行算术运算时,有符号整型会自动转化为无符号整型,若此时有符号整型数值超过无符号整型的最大值或小于无符号整型的最小值时,转换就会出现问题,这里就会产生BUG。
五、防止无符号整数回绕
涉及无符号操作数的计算永远不会产生溢出
如果数值超过无符号整型的限定长度时就会发生回绕,即如果无符号整型变量的值超过了无符号整型的上限,就会返回0,然后又从0开始增大。
六、防止有符号整数溢出
当两个数都是有符号整数时,就有可能产生整数溢出,它将会导致“不能确定的行为”。也就是说整数溢出是一种未定义的行为,会随机出现各种各样的错误,出现的错误主要由编译器决定。