暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

可怕的int溢出

磊哥谈技术 2018-05-08
1212

在pb里面int用两个字节,16位二进制表示,最高位为符号位,int的最大值即为0x7fff,转换成十进制为32767。许多程序员为了节省存储空间能用int变量的绝不用long变量。这样的话很容易就会造成将一个long值赋值给int类型的变量,从而造成数据溢出,进而带来逻辑错误。也许有的程序员会反驳了,说把long值赋给int变量,编译阶段就会报错的,没错在java里面编译是报错的,但是pb里面是直接进行强制类型转换的。

我们通过一个例子来看一下,将32768赋值给int类型的变量li_i,如下图所示。

接着,我们运行一下,得到提示框如下图所示。我们可以看到结果变成了-32768。当你把32768*2+100赋值给li_i的时候,得到的结果就是100了。

在java里面short对应pb里面的int,同样是两个字节表示。我们同样将32768赋值给short类型的变量a,如下图所示:

当编译的时候,因为将int赋值给short造成精度损失所以编译未通过。

接下来,我们进行强制类型转换,如下图所示。

继续编译,没有报错,然后运行test,得到结果 -1,如下图所示.

细心的人可能发现了,同样将32768赋值给int类型的变量,pb里面得到的是-32768,而java里面得到的却是-1。这是因为在java里面是用补码来存放数值的,0Xffff即16个1,表示的就是-1的补码,所以运行test得到的结果是-1。

通过此文提醒广大程序员一定要对数据溢出引起足够的的重视,否则很容易引发严重的bug发生。

文章转载自磊哥谈技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论