| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 498 人关注过本帖
标题:[求助]一个简单的类型转换问题
只看楼主 加入收藏
limaoyuan
Rank: 1
等 级:新手上路
帖 子:493
专家分:0
注 册:2006-6-25
收藏
 问题点数:0 回复次数:9 
[求助]一个简单的类型转换问题
public class Test
{
public static void main(String[] args)
{
byte b=127;
byte c=126;
byte d=(byte)(b*c);
System.out.println(d); //为什么输出-126, 按我的想法上一步相乘应该会超出byte的范围,为什么没有报错呀?
}
}

大家帮我解决一下这个疑问..谢谢!

再添一个问题
which is true?
A. Any statement that may throw an Exception must be enclosed in a try block.
//Standard Exception (Runtime Exception) is not
B. Any statement that may throw an Error must be enclosed in a try block.
C. Any statement that may throw an RuntimeException must be enclosed in a try block.
D.No exception are subclass of Error.

答案写的是D...但Error类也有子类呀....如AnnotationFormatError, AssertionError, AWTError, CoderMalfunctionError, FactoryConfigurationError, FactoryConfigurationError, IOError, LinkageError, ServiceConfigurationError, ThreadDeath, TransformerFactoryConfigurationError, VirtualMachineError

应该选什么呢?


我多问个问题


public class Test
{
public static void main(String[] args)
{
int b=99999999;
int c=99999999;
int d = b*c; //b*c = 9999999900000001 这个数远远超出了int的最大值,为什么也不会报错呀?
System.out.println(d);
System.out.println(Integer.MAX_VALUE); //2147483647
}
}

[此贴子已经被作者于2007-4-30 23:46:23编辑过]

搜索更多相关主题的帖子: 类型 
2007-04-30 14:07
mengsui
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2007-3-24
收藏
得分:0 
的确超出了范围,没有报错是因为你进行了强制转换。
我也觉得应该选D,Exception不是Error的子类。
2007-04-30 16:32
神vLinux飘飘x
Rank: 2
等 级:新手上路
威 望:3
帖 子:436
专家分:0
注 册:2007-1-4
收藏
得分:0 
楼上正解,不过我觉得这个题目的D答案给得实在是太唐突了吧,根本和题目的一点联系都没有,哪怕考 byte*byte超过byte范围自动转换成int也是好的呀
2007-04-30 21:49
风月_无边
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:60
帖 子:2960
专家分:652
注 册:2007-1-19
收藏
得分:0 
超出范围是不会报错,只是答案不正确 !!

我的网站 http://www.
2007-04-30 22:04
神vLinux飘飘x
Rank: 2
等 级:新手上路
威 望:3
帖 子:436
专家分:0
注 册:2007-1-4
收藏
得分:0 
答案D没错的,的确没有一个Exception是Error的子类,除非你多层继承了...无聊

Exception 继承自 Throwable
Throwable 继承自 Object

2007-04-30 22:15
limaoyuan
Rank: 1
等 级:新手上路
帖 子:493
专家分:0
注 册:2006-6-25
收藏
得分:0 
以下是引用神vLinux飘飘x在2007-4-30 22:15:56的发言:
答案D没错的,的确没有一个Exception是Error的子类,除非你多层继承了...无聊

Exception 继承自 Throwable
Throwable 继承自 Object

API上写public class AnnotationFormatError extends Error

按你的说法 AnnotationFormatError 不算是Error的子类,而是算Throwable的子类是吗?

谢谢~~



我在说's blog   http://www..cn
2007-04-30 23:24
神vLinux飘飘x
Rank: 2
等 级:新手上路
威 望:3
帖 子:436
专家分:0
注 册:2007-1-4
收藏
得分:0 
AnnotationFormatError 继承自 Error ,当然是Error的子类,同时也是Throwable的子类
不知道从我的言论怎么能推导出你的观点-_-!

有任何疑问么?
2007-04-30 23:29
limaoyuan
Rank: 1
等 级:新手上路
帖 子:493
专家分:0
注 册:2006-6-25
收藏
得分:0 
以下是引用神vLinux飘飘x在2007-4-30 23:29:45的发言:
AnnotationFormatError 继承自 Error ,当然是Error的子类,同时也是Throwable的子类
不知道从我的言论怎么能推导出你的观点-_-!

有任何疑问么?

明白了,是我理解错了..答案D写的是没有一个exception是error的子类.. 我误以为AnnotationFormatError 是exception了..

谢谢指点!


我多问个问题
高手再指点我下..
public class Test
{
public static void main(String[] args)
{
int b=99999999;
int c=99999999;
int d = b*c; //b*c = 9999999900000001 这个数远远超出了int的最大值,为什么也不会报错呀?
System.out.println(d);
System.out.println(Integer.MAX_VALUE); //2147483647
}
}

高手再指点我下..


我在说's blog   http://www..cn
2007-04-30 23:34
神vLinux飘飘x
Rank: 2
等 级:新手上路
威 望:3
帖 子:436
专家分:0
注 册:2007-1-4
收藏
得分:0 
这个也是很简单的道理,因为Java进行乘法运算的时候,会把他们的运算结果当成是int进行存储(他们也的确是int),关键就是运算的结果是按照什么来保存。
Java选择的是用int进行保存,这样问题就来了:

1.当是两个byte <operator> byte的时候,Java会先把计算结果保存成为int类型。这样,由int转换到byte会有精度损失,所以会出错误
2.当是两个int <operator> int的时候,Java也会先把计算结果保存成为int类型,但是,999999999*999999999计算出的结果不是int类型所能承受得了的,应该是用long进行存储,但是在存储之前就已经是int了,所以运算完之后直接就是int(不用说,精度已经损失),而int到int自然不会强制转换,所以不会报错。

所以,即使你的d用long类型,
long d = b*c;的运算结果也会损失精度的,除非进行强制转换通知JVM
long d = (long)b*c;
2007-05-01 00:00
limaoyuan
Rank: 1
等 级:新手上路
帖 子:493
专家分:0
注 册:2006-6-25
收藏
得分:0 

谢谢神vLinux飘飘x ,学习了~~~~~~~


我在说's blog   http://www..cn
2007-05-01 00:36
快速回复:[求助]一个简单的类型转换问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017813 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved