=======byte强转面试题===== byte b = (byte) 0x88;if(b==0x88){ System.out.println("a");}else{ System.out.println("b");}1)各位可否解释一下为什么输出b2)考点是什么? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 java中的基本类型有8种值类型:长度从短到长分别是:byte,short,int,float,double,long字符串类型:char布尔类型:booleanjava中值类型短转长是自动的,如:int a = 12;double b ;b = a ;长转短需要强行转,且会出现溢出,如double a = 1200 ;byte b = (byte)a;这里b的最大值才255,b会不会等于1200? byte表示的范围是-128到127,0x88是16进制数,表示的是136明显已超出byte表示的范围,再结合楼上的表述,强制转型会有精度损失,转型后所以肯定不是原来的值了 1、经过转换之后b的值为十进制的-120不等于0x88(十进制136)输出else分支2、简单点就是考你强转 深入点就是你要知道int占4字节,byte占1字节 和他们表示的范围,以及其二进制表示形式 int转byte时只将int的低8为作为byte类型的值 0x88 代表的是一个十六进制数字而不是0乘以88这个我感觉是楼主发问的关键点所在byte 只能保存-128---127 之间的数字0x88 转成成byte类型的时候发生了精度遗失,已经不是原来的那个数字了所以if中判断的时候会返回false,去执行else中的内容就会出现楼主所说的结果了!!! 0x88是个int所以在if比较时if (b == (byte) 0x88)是trueif (b == 0x88)是false if(b==0x88){上面这句语句,是要先把b 这个byte 型转换成int型的。0x88这个字面量默认是int型的, 转成 byte 是用其低 8位。但这个低8位的数在byte 型里,最高位是符号位,这里是1,代表这是个负数。已经由原来的数值意义,变成符号意义了。要输出的话,是 -120。当用这个数和 int 型的字面量0x88比较时, 先要把b转型成 int型,它转成int型时,是把前24位都扩展成符号位,用2进制形式表示是: 11111111 11111111 11111111 10001000 (10进制是 -120)而0x88的2进制表示是: 00000000 00000000 00000000 10001000 (10进制是 136)。所以比较是不相等的。 就是把ox88,十六进制转换成十进制,强转byte,而byte的取值范围是-128到127,装不下,就损失精度。然后在if里面比较b和ox88的内存地址是否相等,不相等就输出else里面的内容,就是输出“b”了。考点就是数据类型的转换了 lz可以试试打印下 System.out.println((byte)0x88); System.out.println(0x88); 0x88 是一个int整数 十进制是136二进制如下:0000,0000,0000,0000,0000,0000,1000,1000强制转换 byte,舍弃前24为 取前8位,其中第一位为符号为得到1,000,1000减一得到反码1, 000,0111符号位外取反得到原码1, 111,1000转换为10进制最后得到-120-120<>136所以输b 请教各位前辈一个关于按钮传参的问题 for循环判断数组问题..谢谢 请教ArrayList的用法,有个疑问想请大家帮忙看下。 在eclipse3中如何使用jdk5的特性,如annotation、for in集合、泛型等??? 如何用Java实现将文件压缩成LZH,并解压 关于manifest文件的说明。 找几个例子看看 关于接口实现的问题 java新手GUI的问题 如何写下面语句,!!?来者有分! 多个线程因为得不到锁而阻塞,当锁被释放时,哪个线程会得到锁呢? java的后台进程问题
值类型:长度从短到长分别是:byte,short,int,float,double,long
字符串类型:char
布尔类型:boolean
java中值类型短转长是自动的,如:
int a = 12;
double b ;
b = a ;
长转短需要强行转,且会出现溢出,如
double a = 1200 ;
byte b = (byte)a;
这里b的最大值才255,b会不会等于1200?
1、经过转换之后b的值为十进制的-120不等于0x88(十进制136)输出else分支
2、简单点就是考你强转
深入点就是你要知道int占4字节,byte占1字节
和他们表示的范围,以及其二进制表示形式
int转byte时只将int的低8为作为byte类型的值
而不是0乘以88这个我感觉是楼主发问的关键点所在byte 只能保存-128---127 之间的数字
0x88 转成成byte类型的时候发生了精度遗失,已经不是原来的那个数字了
所以if中判断的时候会返回false,去执行else中的内容就会出现楼主所说的结果了!!!
if (b == (byte) 0x88)是true
if (b == 0x88)是false
上面这句语句,是要先把b 这个byte 型转换成int型的。
0x88这个字面量默认是int型的, 转成 byte 是用其低 8位。但这个低8位的数在byte 型里,最高位是符号位,这里是1,代表这是个负数。已经由原来的数值意义,变成符号意义了。要输出的话,是 -120。当用这个数和 int 型的字面量0x88比较时, 先要把b转型成 int型,它转成int型时,是把前24位都扩展成符号位,用2进制形式表示是:
11111111 11111111 11111111 10001000 (10进制是 -120)
而0x88的2进制表示是:
00000000 00000000 00000000 10001000 (10进制是 136)。
所以比较是不相等的。
System.out.println((byte)0x88);
System.out.println(0x88);
0000,0000,0000,0000,0000,0000,1000,1000强制转换 byte,舍弃前24为 取前8位,其中第一位为符号为
得到1,000,1000减一得到反码1, 000,0111符号位外取反得到原码1, 111,1000
转换为10进制最后得到-120-120<>136所以输b