📅  最后修改于: 2023-12-03 15:39:32.919000             🧑  作者: Mango
在C++中,内置数据类型有一定的取值范围和精度限制。例如,int类型的取值范围为-2147483648到2147483647,double类型的精度为15-16位等等。当我们超出这些范围时,会发生什么呢?
对于整型类型,当超出其范围时,会出现溢出现象。例如,对于以下代码:
int i = 2147483647;
i++;
由于i的取值范围已经到达最大值,再进行加1操作会导致i变为最小值-2147483648。这就是整型溢出。如果开启编译器的警告,例如在GCC下加上-Woverflow选项,编译器会提示溢出现象。
除了溢出,还有一种情况是整型类型的符号位不正确。例如,对于有符号char类型,其范围为-128到127,如果将它赋值为128,则符号位会被当做数据位,导致其取值为-128。
对于浮点型类型,当超出其精度时,会出现舍入误差。例如,对于以下代码:
double d = 1.0 / 3.0;
printf("%.20f\n", d);
由于double类型的精度只有15-16位,当输出20位小数时,会出现舍入误差,导致输出的结果和实际值不完全一致。
当我们超出C++中内置数据类型的有效范围时,可能会发生溢出、符号位不正确或舍入误差等现象。如果在编写代码时考虑不全,这些现象可能会导致程序崩溃或者得到错误的结果。因此,在开发中,我们应该仔细考虑数据类型和数值范围,并进行相应的数据类型转换和数值处理。