我又试了下,代码是这样的:public class Test {
public static void main(String[] args){
byte x='a'+8;//不会报错,why?'a'+8是什么型? byte y=8;
//byte z=y+8;去掉注释会报错,因为y+8是int型
}
}Java只对变量自动转换类型,而不对常量自动转换类型?也不对呀,'a'是2字节常量,x是1字节变量,怎么可以直接赋值?

解决方案 »

  1.   

    char c = 'a'+9;
    System.out.println(c);
    你会明白的
      

  2.   

     byte x='a'+8;//不会报错,why?'a'+8是什么型?'a'是字符  也是ascii码   'a'=97 两个byte型数相加为int型这个跟+号有关  你写一个类重写+方法  在调用这个方法就知道了
    两个int相加为int
    两个float相加为float
      

  3.   

    我忽然想起了
    System.out.println("1+1="+1+1);
    System.out.println("1+1="+(1+1));
      

  4.   

    请参考以下代码:
    float i=100.0;//报错
    float i=100.0f;//正解
      

  5.   

    关于常量的运算会被java优化,在编译期间就提前运算,那样也就相当于直接写了个运算结果,所以是不会报错的。如果是变量和常量之间的运算,java就会需要考虑数据类型。
      

  6.   

    如果说'a'是ASCII码的确说的通,但Java用的是Unicode码吧,我问的是Java又不是C++
      

  7.   

    int是32位;
    char是16位;
    byte是8位;
    char字符的,是asicll值时不超过byte表示范围,在编译时期用byte值都不报错。
    不然就会报错,
    byte x = '中'+8;肯定报错;
    Java就是这么处理的,别太纠结了。
      

  8.   

    自己来宣布正确答案:
    Java中,字符常量有两种类型:ASCII型和Unicode型,常量具体是那种类型由范围决定,原则是够用就行:如'a'是ASCII型,'中'是Unicode型。'a'+6是ASCII型,'a'+60是Unicode型(隐含有自动类型转换)。字符变量一定是Unicode型。所以,像char x='a';这种语句会有一个自动类型转换,把ASCII型的'a'转换成Unicode型的'a',再赋给变量x。
    且Java中,byte型变量运算时会转换成int型
    byte型常量如4,123运算时不会自动转换,而456,345这些常量不是byte型常量,而是short型常量,Java中常量类型的判断原则也是“够用就行”,“不够用自动向更高字节类型转换”