黑马程序员技术交流社区
标题:
JAVA里类型强制转换问题
[打印本页]
作者:
近夜之星
时间:
2013-10-31 12:13
标题:
JAVA里类型强制转换问题
<p>package day1604;
public class Cast
{
public static void main(String[] args)
{
int i=257;
double d = 323.142;
byte a,b;
a=(byte)i;
b = (byte)d;
System.out.println("a="+a);
System.out.println("b="+b);
}
}</p><p>
</p>
复制代码
为什么a=1,b=67
作者:
0从谷0
时间:
2013-10-31 12:24
因为i=257,强制转换成byte的二进制码是00000001,结果自然是1.
d=323.142,强制转换成byte的二进制码是01000011,结果是67.
作者:
李慧声
时间:
2013-10-31 12:38
什么叫降至类型转换?就是说你超过我得范围了,但是我还是要用你,那我就把你超过我得范围的东西全都扔掉!
那么现在来看,int i=257; double d = 323.142; byte a,b;a=(byte)i; b = (byte)d;
i在内存中的表现形式:
0000-0000 0000-0000 0000-0001 0000-0001
,而byte(一个字节八位)的范围是-128-127,那么这257明显超过127了吧,那么没办法,我只能用最低8位了,所以我就把你的最低8位给截取了拿到的是不是就是
0000-0001
,显然这应该是1吧,就是这么来的;
至于b其实道理是一样的,先去掉小数,double是8个字节,但是我只能用整数的最后8位,那截取的道理和i是一样的。
...0000-0000 0000-0000 0000-0001 0100-0011,那最低8位就是0100-0011,对应的二进制自然是67了呀!
作者:
魏春旭
时间:
2013-10-31 12:48
强制类型转换的时候,超过范围的二进制码部分自动舍弃了。
作者:
mayor125
时间:
2013-10-31 13:28
int i = 257;由于int类型是4个字节,也就是32位,变量i在内存中的二进制是0000-0000 0000-0000 0000-0001 0000-0001,a=(byte)i;将变量i强制转换成byte类型,而由于byte类型是1个字节,所以强制转换之后要砍掉前面的24位,剩下来的就是0000-0001,也就是1,所以输出a = 1;
double d = 323.142;由于double类型是8个字节,也就是64位,变量d在内存中的二进制是0000-0000 0000-0000 0000-0000 0000-0000 0000-0000 0000-0000 0000-0001 0100-0011, b = (byte)d;是将变量d强制转换成byte类型,而byte类型是1个字节,所以要砍掉前面的56位,剩下来的就是0100-0011,也就是67,所以打印输出b = 67;
作者:
胡志翔
时间:
2013-10-31 13:39
byte类型的数据的范围是-128-127,楼主所强转的int i=257和double d = 323.142都超过了byte数据类型的范围,超过范围的二进制码部分自动舍弃了。
强转之后a拿到的数据是0000-0001,b拿到的数据是0100-0011
1 67
作者:
近夜之星
时间:
2013-10-31 14:02
0从谷0 发表于 2013-10-31 12:24
因为i=257,强制转换成byte的二进制码是00000001,结果自然是1.
d=323.142,强制转换成byte的二进制码是01000 ...
明白了,thankyou!:P
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2