黑马程序员技术交流社区
标题:
一些不起眼的细节
[打印本页]
作者:
李志广
时间:
2012-8-5 23:39
标题:
一些不起眼的细节
下面的代码,你能看出它们的正确答案吗?能够说出为什么得出这样的结果吗?
class Demo
{
public static void main(String[] args)
{
int iValue=233;
byte bValue=(byte)iValue;
System.out.println(bValue);//
输出结果为-23,是怎样运算出来的,能够具体的说一下吗?
char c=97;
System.out.println(c);
double div=6.0/0.0;
System.out.println(div);//
为什么不报异常呢,而是输出:Infinity
//System.out.println("5除以0.0的结果为:"+-5/0);
//而它却行不通?
System.out.println("Hello!"+'a'+7);
System.out.println('a'+7+"Hello");
}
}
虽然是一些简单的例子,但是还是有很多的疑问,有的知道答案,却说不出它的依据,求解释???{:soso_e100:}
作者:
瞿乐
时间:
2012-8-6 00:17
求解释,我也不懂……
作者:
hello world
时间:
2012-8-6 00:20
希望能帮到你,该睡觉了。
类型.jpg
(807.48 KB, 下载次数: 94)
下载附件
2012-8-6 00:19 上传
作者:
于启会
时间:
2012-8-6 00:25
public class test {
public static void main(String arg[]){
int iValue=128;
byte bValue=(byte)iValue;
System.out.println(bValue);
}
}
复制代码
byte 的取值范围是-128到127之间,一共可以存256个数字
int iValue=233;超出了byte的最大值
当iValue=128的时候,它输出-128 也就是说当int值大于127的时候它会返回自己的最小的值。并且每多1本身的最小值加1,当int值为128时,返回为最小值,也就是当int=129时,输出为-127。所以233-128=105, 可以在最小值的基础上加105,则-128+105=-23
整数除0运算时会出错,但在浮点型却不会,Java语言定义了三个特殊的浮点值来表示浮点数除0运算时的各种出错情形:
Infinity:整无穷大(正数除零时的结果)
-Infinity:负无穷大(负数除零时的结果)
NaN:Not a Number(0.0/0或负数开平方根时的结果)
所以6.0/0.0;的结果是:Infinity
作者:
孙飞
时间:
2012-8-6 00:38
byte类型的值的取值范围是-128到127,把int型的233强转为byte型,就超出了这个 范围,就要用到溢出情况的计算,就是把溢出的部分用最小值来进行计算,233转成byte型,溢出了105,所以用-128计算这一部分就是-128+105=-23 double div=6.0/0.0;这个不报异常吧,因为浮点型的值不是一个准确的值,0.0相当一个无限接近于0的一个数,所以一个非0的数除以一个无限接近于0的数就得到一个无穷大的数,就用Infinity表示,(如果是0除以0就是NaN),int型的值是一个准确的值,你懂的
作者:
李知伦
时间:
2012-8-6 00:45
1.
因为byte类型的数在内存里占8位(int是32位), 表数范围是-128~127 233>127,强制转换成byte时就溢出了
强制转换过程是这样的
iValue 233:
00000000000000000000000011101001
bValue:
11101001
左边第一位是符号位,为1,也就是个负数,负数在计算机里是以补码的形式存在的,需要换算成原码
11101001 补码减1=反码
11101000 按位取反成为原码(符号位不变)
10010111 原码=-23
2.
"/"除法运算时,两个运算数有1个是浮点数(double),或者2个都是,结果也是浮点数,而且允许除数是0或0.0,得到结果是无穷大或负无穷大
5/0 除零异常
5/0.0 Infinity(正无穷)
-5/0.0 -Infinity(负无穷)
5.0/0 Infinity(正无穷)
5.0/0.0 Infinity(正无穷)
作者:
黑马振鹏
时间:
2012-8-6 00:48
class Demo2
{
public static void main(String[] args)
{
int iValue=250;
byte bValue=(byte)iValue;//iValue变成了字节,打印字节,查询ASCC码表,打印出对应的值
System.out.println(bValue);//输出结果为-23,是怎样运算出来的,能够具体的说一下吗?
char c=97;
System.out.println(c);
double div=6.0/0.0;
int x = 5/0;
System.out.println(div);//为什么不报异常呢,而是输出:Infinity
// System.out.println("5除以0.0的结果为:"+-5/0);//而它却行不通?
System.out.println("Hello!"+'a'+7);//字符串+字符+整数 变成了字符串
System.out.println(("Hello!"+'a'+7).length());
System.out.println('a'+7+"Hello");//'a'+7先变为104,然后和字符串相加,变成字符串
System.out.println(('a'+7+"Hello").length());
}
}
除法问题:
整形的除法肯定没有疑惑,5/0就会抛出异常。
Double类型0可以作为除数,根据数学知识可以知道除以零,就是得到一个无穷大的数值。
查询API发现Double有个方法isInfinite()
boolean isInfinite()
如果此 Double 值在数值上为无穷大,则返回 true;否则返回 false。
boolean b = new Double(div).isInfinite();
System.out.println(b);
打印结果为true.
作者:
李志广
时间:
2012-8-6 08:17
谢谢,希望共同进步!!!!问题已解决
作者:
刘渝灵
时间:
2012-8-6 20:54
java中所有的整型都是有符号的。整型数据存储时是以补码的形式存在的。原码的第一位是符号位,1表示正数,0表示负数。正数的原码,反码,补码相同,负数的原码和补码相同,但是补码是反码加1。int 4占个字节,byte 占一个字节。
int 233 byte(233)//取233后8位
原码00000000 00000000 00000000 11101001 补码11101001
反码00000000 00000000 00000000 11101001 反码11101000
补码00000000 00000000 00000000 11101001 原码00010111
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2