JAVA 整数溢出问题
2014-06-05 21:52
197 查看
int 类型在 Java 中是“有符号”的。所谓“有符号”就是有正负。
在计算机中用二进制表示所有的信息,这个符号的区别就看首位。
首位如果是 0,就是正的,1 就是负的。正与负的区别也因此就在于取反加一。这不仅在 Java,在任何语言中都是这样的。
所谓数值溢出就会出现这个现象。
Java 中的 int 总共就 32 位,正数上限的情况首位也只能是 0,其他位都可以是 1(就是 2^31-1 的情况)。但是如果正数过大了,例如 2^31,计算机不得不把首位变成 1,并且很快就忘了这是溢出情况,把它按照正常的方式输出了,于是就成了负的。其实也不能怪它,它没有办法自动处理超过溢出的情况,因为 32 位是固定的,它不能因为溢出而临时扩展到 33 位之类的。
2^31 - 1 = 0111 1111 1111 1111 1111 1111 1111 1111 = 2147483647
2^31 =
2^31 - 1 + 1 = 1000 0000 0000 0000 0000 0000 0000 0000 = -2147483648
以上是负数的情况。溢出变成 0 的话道理也一样。你想如果一个数大到最后 32 位都是 0 了,那计算机只能把它认作 0。这种情况有很多,例如 2^32 就是一共 33 位,首位 1,后面 32 位都是 0。
在计算机中用二进制表示所有的信息,这个符号的区别就看首位。
首位如果是 0,就是正的,1 就是负的。正与负的区别也因此就在于取反加一。这不仅在 Java,在任何语言中都是这样的。
所谓数值溢出就会出现这个现象。
Java 中的 int 总共就 32 位,正数上限的情况首位也只能是 0,其他位都可以是 1(就是 2^31-1 的情况)。但是如果正数过大了,例如 2^31,计算机不得不把首位变成 1,并且很快就忘了这是溢出情况,把它按照正常的方式输出了,于是就成了负的。其实也不能怪它,它没有办法自动处理超过溢出的情况,因为 32 位是固定的,它不能因为溢出而临时扩展到 33 位之类的。
2^31 - 1 = 0111 1111 1111 1111 1111 1111 1111 1111 = 2147483647
2^31 =
2^31 - 1 + 1 = 1000 0000 0000 0000 0000 0000 0000 0000 = -2147483648
以上是负数的情况。溢出变成 0 的话道理也一样。你想如果一个数大到最后 32 位都是 0 了,那计算机只能把它认作 0。这种情况有很多,例如 2^32 就是一共 33 位,首位 1,后面 32 位都是 0。
相关文章推荐
- Java中整数溢出的问题:int i=1000000;i*i为何等于-727379968,Java是如何处理溢出的?
- java 字符串转化为整数溢出问题处理
- JAVA中整数类型数据溢出问题研究
- JAVA开发(4) -JVM 内存溢出问题的解决
- 整数溢出问题——讲的不错
- java用Socket实现的远程桌面浏览 内存溢出问题
- JAVA程序内存溢出问题的分析
- 深入JVM(2): 由一个栈溢出的问题看Java类和对象的初始化
- java经典问题——求正整数的位数
- 关于eclipse虚拟内存溢出问题(Failed to create the java Virtual Machine)
- 关于java 内存溢出问题
- nested exception is java.sql.SQLException: 数字溢出的问题解决
- JAVA中格式化输出整数问题~
- 有关Java中两个整数的交换问题
- 关于JAVA内存溢出问题
- SSH整合遇难到的非堆内存溢出问题java.lang.OutOfMemoryError: PermGen space
- 持久层框架中通过Record对象获取Blob对象值导致java堆栈溢出的问题
- java大图片内存溢出问题解决办法
- java 程序内存溢出问题查找
- JAVA程序内存溢出问题的分析