byte b = (byte) 0x88;
if(b==0x88){
System.out.println("a");
}else{
System.out.println("b");
}1)各位可否解释一下为什么输出b
2)考点是什么?

解决方案 »

  1.   

    java中的基本类型有8种
    值类型:长度从短到长分别是: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?
      

  2.   

    byte表示的范围是-128到127,0x88是16进制数,表示的是136明显已超出byte表示的范围,再结合楼上的表述,强制转型会有精度损失,转型后所以肯定不是原来的值了
      

  3.   


    1、经过转换之后b的值为十进制的-120不等于0x88(十进制136)输出else分支
    2、简单点就是考你强转
       深入点就是你要知道int占4字节,byte占1字节
       和他们表示的范围,以及其二进制表示形式
       int转byte时只将int的低8为作为byte类型的值
      

  4.   

    0x88  代表的是一个十六进制数字
    而不是0乘以88这个我感觉是楼主发问的关键点所在byte 只能保存-128---127 之间的数字
    0x88 转成成byte类型的时候发生了精度遗失,已经不是原来的那个数字了
    所以if中判断的时候会返回false,去执行else中的内容就会出现楼主所说的结果了!!!
      

  5.   

    0x88是个int所以在if比较时
    if (b == (byte) 0x88)是true
    if (b == 0x88)是false
      

  6.   

    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)。
    所以比较是不相等的。
      

  7.   

    就是把ox88,十六进制转换成十进制,强转byte,而byte的取值范围是-128到127,装不下,就损失精度。然后在if里面比较b和ox88的内存地址是否相等,不相等就输出else里面的内容,就是输出“b”了。考点就是数据类型的转换了
      

  8.   

    lz可以试试打印下
    System.out.println((byte)0x88);
    System.out.println(0x88);
      

  9.   

    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