黑马程序员技术交流社区

标题: byte三道题:byte b=(byte)2147483647;s.o.p(b);结果是多少? [打印本页]

作者: 曲终烟尽    时间: 2015-6-2 10:33
标题: byte三道题:byte b=(byte)2147483647;s.o.p(b);结果是多少?
考一下你们的知识。
1.输出是多少?为什么???
public void myTest()
        {
                byte b=2;
                int i=2147483647;
                byte c=4;
                b=(byte)i;
                System.out.println(b);
        }
第二个问题:

byte b=2;
byte c=2;
b=b+c;//为什么报错
第三个问题:

byte b=2;
int i=2;
b=b+(byte)i;//为什么报

我本来是为了知道第三个问题的,写到这里我豁然开朗,知道为什么了,因为第二题和第三题是一个道理,你要明白了第二题你就直到第三题为什么行不通了。!


作者: forTomorrow    时间: 2015-6-2 11:54
第一题:byte在内存中占1个字节,范围是-128-127,2147483647明显超出了该范围,所以结果是-1
第二题:b+c运算的时候会向上转型先分别将b和c转换成int类型然后再进行运算,最后结果是int类型,所以得把结果转换成byte类型才能赋值给b
第三题:和第二题类型,表面看是将i强制转成byte,其实在进行加法运算的时候,又要转成int,最后结果是int,只有将最后结果强制转成byte才能赋值给b

旁白:当操作数是byte,short,int,char类型进行运算时,都会强制转成int进行运算,结果是int类型
作者: 曲终烟尽    时间: 2015-6-2 12:41
forTomorrow 发表于 2015-6-2 11:54
第一题:byte在内存中占1个字节,范围是-128-127,2147483647明显超出了该范围,所以结果是-1
第二题:b+c ...

不过第一题没说明原因和原理。数值改了结果也是会变的,
2147483647的二进制是
0111 1111 1111 1111 1111 1111 1111 1111
削去前边3个字节,最后一个字节是 1111 1111,代表的是 -1
1取反+1 就是-1
同理可得其他十进制int到byte的值

作者: forTomorrow    时间: 2015-6-2 12:53
曲终烟尽 发表于 2015-6-2 12:41
不过第一题没说明原因和原理。数值改了结果也是会变的,
2147483647的二进制是
0111 1111 1111 1111 1111 ...

是的,转成byte的话,只取低八位
作者: artcool    时间: 2015-6-2 22:23
好吧,看了上面都回答的那么好了,进来留个回复吧




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