黑马程序员技术交流社区
标题: 一个在运算中数据类型转换的问题 [打印本页]
作者: 张天昊76 时间: 2013-11-17 21:31
标题: 一个在运算中数据类型转换的问题
本帖最后由 张天昊76 于 2013-11-18 23:21 编辑
1、在两个相同的低类型(byte和short)变量相加时,结果类型自动提升为int。问题是,这两个变量做运算时先类型提升为int后再相加,还是先相加,把得到的结果类型自动提升为int了。例如:
- byte a=66,b=90;
- System.out.println(a+b); //结果是156
- System.out.println((int)(a+b)); //结果是-100
复制代码 [qq]2321320300[/qq]
作者: 付凯鹏 时间: 2013-11-17 22:45
这两个变量做运算时先类型提升为int后再相加,下面有个小例子供加深理解;
short s1 = 1; s1 = s1 + 1;由于s1+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型s1时,编译器将报告需要强制转换类型的错误。
short s1 = 1; s1 += 1;由于 +=是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
作者: 天ya~_琼楼 时间: 2013-11-17 22:45
先提升为int,在进行相加。我们下看下边代码:- class Test
- {
- public static void main(String[] args)
- {
- byte a=1,b=1;
-
- byte c =a+b;
- System.out.println(c);
- }
- }
复制代码 编译时就会提示损失精度,需要byte,找到int。
如果是先相加得到结果再提升,此时a+b=2,没有超出byte类型,按理说不应该自动提升数据类型了,但是结果还是提升了。
由此可见,先相加得到结果再提升数据类型 不成立。
另外,提一点,楼主代码中,System.out.println((int)(a+b));结果之所以是-100,是因为楼主采用的是中问字符的括号,因此编译时提示异常,并显示-100,正常情况下,结果仍然是156.
只有在把这个结果强转回byte型时,才会得出-100.
原因是,计算结果是计算结果是int型,是32位,而byte最高只有8位,8为存储的正数最高是127(0111 111),因此存储不下计算结果。
强制转换时会把int型156(0000 0000 0000 0000 0000 0000 1001 1100)的前24位全部忽略掉,变为1001 1100,对应十进制-100.
作者: 张天昊76 时间: 2013-11-18 23:01
结果是int型我知道,问题关键是这两个变量时先类型提升后再做的运算呢,还是运算完了再类型提升的呢?
作者: 张天昊76 时间: 2013-11-18 23:13
你说每超出byte类型范围,按理说不应该提升数据类型。这是为啥呢?不过我也想明白了,如果说是先相加在提升的话,那就是说这个值提升前前是byte的156(这显然不可能),就像定义变量byte b = 156,就没法通过编译。还是很谢谢你啦!很耐心的解答了后面的。
作者: Linuxgg 时间: 2014-2-23 17:54
#在这里快速回复#谢谢楼主期望灌水,我是来拿技术分 Sun Feb 23 17:54:25 CST 2014
作者: Linuxgg 时间: 2014-2-23 20:29
#在这里快速回复#谢谢楼主期望灌水,我是来拿技术分 Sun Feb 23 20:29:16 CST 2014
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |