1. byte b1=(int)1;
2. byte b2 =1;
3. byte b3 =b1+b2;
4. byte b4 =1+1;
第一行和第四行为什么编译可以通过?

解决方案 »

  1.   

    1. byte b1=(int)1; --->将byte强制转换成int
    2. byte b2 =1;     --->默认的1应该是int型的  byte怎么定义 你应该知道吧 呵呵
    3. byte b3 =b1+b2; --->因为b2不是int型的  得转换
    4. byte b4 =1+1;   --->1是int型的  执行了+运算  转换成了int型了
      

  2.   

    int 可以隐式的转换成 byte 行吗?如果可以的话 第二行为什么通不过?
      

  3.   

    int 可以隐式的转换成 byte 行吗?如果可以的话 第三行为什么通不过?
      

  4.   

    第二行可以编译通过啊。
    byte-->int(强制转换)
      

  5.   

    第三行不能编译通过的理由是:cannot convert from int to byte
    第四行也应该报同样的错呀???
      

  6.   

    1. byte b1=(int)1; 确实不明白,左边是byte型,右边是int型,怎么也能等呢?怎么解释??
      

  7.   


    package test;public class test{
    public static void main(String args[]){
    byte b1 = (int)1;
    byte b2 = 1;
    // byte b3 = b1 + b2;
    byte b4 = 1 + 1;
    int a = 1;
    System.out.println("b1=" + b1 + " b2=" + b2 + " b4=" + b4);

    System.out.println("b1=" + TypeTest.getType(b1) + " b2=" + TypeTest.getType(b2) + 
    " b4=" + TypeTest.getType(b4) + " a=" + TypeTest.getType(a));
    }
    } //判断变量类型(基本数据类型)
    class TypeTest{
    static String getType(byte d){ return "byte";};
    static String getType(int d){ return "int";};
    static String getType(short s){ return "short";};
    static String getType(boolean b){ return "boolean";};
    static String getType(float s){ return "float";};
    static String getType(double d){ return "double";}; 
    }
      

  8.   

    确实有点怪...
    good question
      

  9.   

    这是虚拟机的特殊机制造成的
    我们知道,java为了使速度快一些,采取了很多措施,其中一项就是:
    在内存中特别开辟一块地方来存放基本数据类型和String类型,这是因为这些类型比较常用,这也导致java不是完全面向对象的这样,整数类型被默认为int的,小数被默认为double的
    但是由于在这块内存中,数据最终还是以数据位来表示的,这样,-128~127的整数是以一个字节来存放,其他的整数是以2个以上字节来存放的(这么做的好处是节省内存),这就导致了,直接用-128~127的整数来给byte赋值成了合法的了
    这就解释了byte a=1; 的合法性的问题
    而1+1这个表达式是直接在这块内存里面进行操作的,所以byte a=1+1;也是合法的但是,对于变量的计算,则是把值复制到另外一块内存里面进行操作的,由于声明的时候a=1的1是在存放基本数据的内存块中指定的,默认情况还是整数,所以提取到外面的时候就被强制转换成4个字节的证书,所以得到的结果并不是一个字节的整数,而是4个字节的整数,这样byte+byte和byte+short和byte+int都为int了,所以不能赋给byte以上为个人猜测,仅供参考,有待专家指正
      

  10.   

    你告诉我byte 存储的大小是多少,你就告诉了你自己答案!
    一个可以装装一升水的杯子 为什么不可以装半升水?
      

  11.   

    byte b =1;1为 int型  4个字节
    b为 byte型 1个字节
    把一个int 给 byte
    哪来的的一个杯子装半升水?
      

  12.   

    1和2没有区别,变量在编译时赋值,虽然1是int型,但未超出byte的取值范围,编译通过;
    3编译时报错,因为b3无法在编译时赋值(因为变量的关系),编译器只能根据byte取值范围小于int这一点来判断,为安全起见而报错,加上强制转换则通过编译;
    4在编译时赋值,1+1得2,未超出byte取值范围,可以赋值,编译通过。
      

  13.   

    [Quote=引用 18 楼 alex0058 的回复:]
    引用楼主 haishen0930 的帖子:
    1. byte b1=(int)1; 
    2. byte b2 =1; 
    3. byte b3 =b1+b2; 
    4. byte b4 =1+1; 
    第一行和第四行为什么编译可以通过?  
    1和2没有区别,变量在编译时赋值,虽然1是int型,但未超出byte的取值范围,编译通过; 
    3编译时报错,因为b3无法在编译时赋值(因为变量的关系),编译器只能根据byte取值范围小于int这一点来判断,为安全起见而报错,加上强制转换则通过编译; 
    4在编译时赋值,1+1…
    [/Quote
    ]
    OK 虽然会做范围检查,但是这样似乎表示编译器允许一个int型自动赋给一个byte型而不用强转?
      

  14.   

    1. byte b1=(int)1; 
    2. byte b2 =1; 
    3. byte b3 =b1+b2; 
    4. byte b4 =1+1; 
    第一行和第四行为什么编译可以通过?
    第二行也可以通过
    这是为什么?
    因为对byte类型进行赋值时,在byte类取值型范围以内的整数都可以赋值给byte类型,这是规定的,java就是这样规定没办法;
    但当在byte类型或short或char类型进行运算时,必须把他们的类型都换成int型进行运算;
    所以只有3是错的,其它都正确
    说明下,4的是两个常量进行相加,得到是2是int型常量 可以默认赋值给byte类型