JSpinner中整型溢出???谁的BUG?
最近在测试一个Swing客户端的时候,发现了一个很怪异的BUG,JSpinner竟然会发生整型溢出的问题。
具体的现象如下:
创建一个JFrame,放置一个JSpinner控件,将其最大值设置为999999999,然后再随便放置别的一个可以获取焦点的控件,运行。
JSpinner
界面很简单,但是当你输入8888888888(10个8)的时候,把焦点移走,你会发现它变成了298954296。
输入4444444444(10个4)的时候,它会变成149477148,而输入别的数值的时候,一切正常。
为什么呢???
经过简单的分析,Java中整型的取值范围是[-2147483648,2147483647],而这是4294967296,
4294967296 × 2 + 298954296 = 8888888888,由此可以确定,这是发生了溢出。
但是,为什么只有10个8或者10个4(别的暂时还没发现)会发生这个问题呢?
网上Google、百度怎么也找不到相关的解释,我也就不得而知了。
另外,还有我们经常使用的QQ,也存在这个问题。
登录QQ,然后查找好友,输入8888888888,你会发现,它的检索结果是298954296,
而输入4444444444,它的检索结果是149477148,跟JSpinner的错误情况一模一样。
再看.Net的NumericUpDown控件,它则没有这个问题,为什么呢?
NumericUpDown
它很聪明,没有使用整型,而是使用了decimal,那就没有整型溢出的问题了。
各位高手,为什么这个问题普遍存在,Java的JDK有这个问题,而且QQ也有呢?
难道是CPU的问题?内存的问题?
具体的现象如下:
创建一个JFrame,放置一个JSpinner控件,将其最大值设置为999999999,然后再随便放置别的一个可以获取焦点的控件,运行。
界面很简单,但是当你输入8888888888(10个8)的时候,把焦点移走,你会发现它变成了298954296。
输入4444444444(10个4)的时候,它会变成149477148,而输入别的数值的时候,一切正常。
为什么呢???
经过简单的分析,Java中整型的取值范围是[-2147483648,2147483647],而这是4294967296,
4294967296 × 2 + 298954296 = 8888888888,由此可以确定,这是发生了溢出。
但是,为什么只有10个8或者10个4(别的暂时还没发现)会发生这个问题呢?
网上Google、百度怎么也找不到相关的解释,我也就不得而知了。
另外,还有我们经常使用的QQ,也存在这个问题。
登录QQ,然后查找好友,输入8888888888,你会发现,它的检索结果是298954296,
而输入4444444444,它的检索结果是149477148,跟JSpinner的错误情况一模一样。
再看.Net的NumericUpDown控件,它则没有这个问题,为什么呢?
它很聪明,没有使用整型,而是使用了decimal,那就没有整型溢出的问题了。
各位高手,为什么这个问题普遍存在,Java的JDK有这个问题,而且QQ也有呢?
难道是CPU的问题?内存的问题?



浙公网安备 33010602011771号