黑马程序员技术交流社区

标题: 关于整数赋值溢出的一个小问题 [打印本页]

作者: 王小五-fight    时间: 2013-4-11 19:00
标题: 关于整数赋值溢出的一个小问题
本帖最后由 王小五-fight 于 2013-4-11 21:46 编辑

/*测试当给变量赋值超过其最大范围时,它会如何给出结果;其中a1所赋值为其int类型的最大值
*/
class Zhuanhuan_int
{
        public static void main(String[]args)
        {
                int a=5;
                int a1=Integer.MAX_VALUE;
                int a2=2;
         
作者: huima    时间: 2013-4-11 19:23
这是二进制补码的相关内容,java整形是32位,从32个0,到32个1这是整形的范围,首位0表示正数,1表示复数。所以最大值就是0111 1111 1111 1111 1111 1111 1111 1111,如果加1,就变成了1000 0000 0000 0000 0000 0000 0000 0000 这一下就天堂到地狱,这个是最小值了(这里有负数的补码运算,不是直接二进制加出来的)。-2^31.你继续加1那么就是-2^31+1,这是二进制运算的原理,你加过头了就会溢出,如果你变成long,那么就用最高位去补。
作者: 645420297    时间: 2013-4-11 19:26
因为Integer.MAX_VALUE;是代表java int型的最大值 而最大值加1会变成最小值Integer.MAX_VALUE;=2147483648
int a1=Integer.MAX_VALUE;
                int a2=2;
                a=a1+a2;
而你这个是把a1、a2赋值给a了 所以就变成最大值加2了 所以就成了-2147483647
作者: 王小五-fight    时间: 2013-4-11 19:43
huima 发表于 2013-4-11 19:23
这是二进制补码的相关内容,java整形是32位,从32个0,到32个1这是整形的范围,首位0表示正数,1表示复数。 ...

嗯,表示自己粗心把数学演算整错了,整数的补码不变,负数的补码符号位不变,其余取反加1。对于上边计算还是用二进制进行加减,只不过是计算机中是使用补码的形式在运算,那么就要从补码转换到原码来。1000-0000  0000-0000 0000-0000  0000-0001(补码)对于这个结果,明白其实是负数,因为符号位为1,其为补码形式,要转换成原码。就要原道返回,减1,其它位除了符号位取反,即为1111-1111  1111-1111  1111-1111  1111-1111(原码)=-2147483647

作者: huima    时间: 2013-4-11 19:55
恩恩,哥们,你理解就好,希望我们之间互利共赢哈!!!
作者: huima    时间: 2013-4-11 19:56
王小五-fight 发表于 2013-4-11 19:43
嗯,表示自己粗心把数学演算整错了,整数的补码不变,负数的补码符号位不变,其余取反加1。对于上边计算 ...

恩恩,哥们,你理解就好,希望我们之间互利共赢哈!!!
作者: 王小五-fight    时间: 2013-4-12 07:49
huima 发表于 2013-4-11 19:56
恩恩,哥们,你理解就好,希望我们之间互利共赢哈!!!

那是必须的,共同进步啊。我起点比较低,多指教。
作者: huima    时间: 2013-4-12 09:45
王小五-fight 发表于 2013-4-12 07:49
那是必须的,共同进步啊。我起点比较低,多指教。

恩恩,共同努力!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2