整数溢出小问题

来源:互联网 发布:ubuntu 断电日志 编辑:程序博客网 时间:2024/05/29 18:51

很多C教材上都说过:我们应该“尽量”“避免”自动类型转换。尤其是避免我们所不知情的降级!

  

#include<stdio.h>int main(void){long long res1,res2;int num = 2147483647;
printf("long long 's length: %d\n""int 's length: %d\n",sizeof(long long), sizeof(int));//我的电脑上long long是8bytes,short是4bytesres1 = num*num;printf("未进行指派时:res = %lld\n", res1);res2 = (long long)num*num;printf("进行指派后:res = %lld\n", res2);
return 0;}

我们发现当我们未进行指派时,我们所求的结果溢出了!这是因为当我们对两个int类型的num进行相乘时,结果会首先被自动转换为int类型,然后再赋值给res;而结果呗自动进行类型转换的过程中会出现自动类型转换并且有可能降级!

这是我在做《C Primer Plus》上的一道习题的时候发现的一个我们可能会忽视的问题。当将long long 换为int(4),int更换为short(2)时,不会出现这样子的问题:

#include<stdio.h>int main(void){int res1,res2;short num = 32767;printf("int 's length: %d\n""short 's length: %d\n",sizeof(int), sizeof(short));//我的电脑上int是4bytes,short是2bytesres1 = num*num;printf("未进行指派时:res = %lld\n", res1);res2 = (int)num*num;printf("进行指派后:res = %lld\n", res2);return 0;}
因为在int类型被认为是计算机处理起来最方便有效的整数类型,short类型会被转换为int类型进行计算,所以这个时候指派不会起什么作用。

但是考虑到第一个问题的严重性,我们还是要记得在处理不同类型数据的计算,赋值的时候,多用指派!

另外,在解决这个问题的时候我还发现了如下问题:

1》同类型数据在做计算时,结果赋值给与它们相同类型的量(变量或者常量)时,很有可能发生溢出,所以在我们进行相关计算的时候最好用一个较高级别的类型来存储结果,于是便有了下一个问题。

2》相邻级别的数据类型依然有可能发生溢出!我所说的相邻级别是指按如下排列的相邻级别

  unsigned long long > long long > unsigned long > long > unsigned int > int > unsigned short > short >unsigned char > char
(我们暂且不考虑int 与long 或者int 与short相同长度的情形)

大家可以自己算一下,较低级别的最大值相加或者相乘不可能大于与其相距两个级别以上的数据类型的最大值,却有可能大于与之相邻的类型的最大值,当我们选取存储结果的数据对象的时候,我们有必要将这一点考虑在内!

在这儿我只考虑了关于整数相加相乘时遇到的溢出问题,对于相减相除遇到的类型转换以及对于它们的结果的存储所需要考虑的没有细细思考。

好了,这是小菜我今天在英语课上的一些想法……

0 0
原创粉丝点击