在前面的文章,我提到了int,而这篇文章主要写long。通常我们都知道,int二进制取值范围为-32768~32767,如果它的值不在这个范围内,那么编译器就会把它当作long int 类型(当然这个是假设这种类型可以表示该数字的前提),如果它还是超出了long可表示的最大值,则编译器把它当作unsigned long long类型(同时前提也是编译器能够识别该数据类型)。
(一)int数据溢出该如何解决?
如果是数据溢出的话,我们就假设用有符号类型和无符号类型来做一个案例,解决案例如下:
int main(void){
int test = 2147483647;
unsigned int test1 = 4294967295;
printf("%d %d %d\n",test,test + 1,test + 2);
printf("%u %u %u\n",test1,test1 + 1,test1 + 2);
return 0;
}
运行效果:
分析:
如上面的代码案例中,可以把整个过程当作跑800米一样,800米第一圈test相当于第一个400,test1相当于第二圈400米的开始和结束,所以test溢出时,test从0开始。
(二)long输出
在上面的案例中,打印unsigned int test1 = 4294967295想要用到%u,而打印到long则只需要%ld方可,如是long与int相同,可以用%ld输出相应的值,也可以用%d输出相应的值。
int main(void){
long test = 2147483647;
printf("test values is %ld\n",test);
return 0;
}
运行结果
写到这里的时候,不难以发现,其实它是和int差不多一样的,如果是int溢出,则阅读如上的int数据溢出该如何解决?