就是byte,short和char  默认都会转换为 int,我写了下面测试代码  short a = 3;  这个编译可以同过,  然后我写成如下形式 int m = 3; short n = m;这里编译就通不过了,非得向下强制类型转换short m = (short)n;这样才对.    这里就搞不清楚了第一次那个实验 3默认是int类型的  为什么不需要向下强制类型转换就能通过编译了.

解决方案 »

  1.   

    char

                  byte→short→int→long→float→double
    图3.9自动类型转化图
      

  2.   

    这个知道啊!  可是这里 short a = 3;  这个3默认是int类型   int类型到short类型小大范围到小范围  应该要强制类型转换的啊  可这里没用强制类型转换也通过了  这个是我想问的
      

  3.   

    你用short接受一个int,肯定编译不通过啊   
      

  4.   


    就是 short a = 3; 编译能通过啊    我想搞清楚这个愿原因啊
      

  5.   

    short a = 3;中的3就是short类型的不是int类型的。short是16位有符号数,范围是-2^15~2^15,当然可以表示一个小小的3啦。
      

  6.   

    3在没有定义类型之前,你怎么就肯定3是int 类型的呢?逻辑错误。
      

  7.   


    我看书上说的是整数默认是int类型 小数默认是double类型的!
      

  8.   


    java里面  不是默认整数是int类型的吗  还有小数默认是double类型
      

  9.   

    3应该是被默认为short类型了,这种问题不用太深究。
      

  10.   

    书本上的东西也不可尽信。引用一个汇编语言里的概念。
    3其实是一个立即数,在翻译阶段即可确定其值。(不仅是立即数本身,立即数之间的基本算术运算都会在翻译阶段直接确定其值,例如:int a=3+5;翻译后查询字节码会发现找不到3和5,只有一个8)
    由于值已经确定,所以在翻译阶段即可根据上下文判断其能否放入目标变量。例如:
    short s=3;
    byte b=250+10;//由于260超过了byte的存储范围(0-255),因此通不过
    再反思下不能确定值的情况,即使用变量:
    int i=10;
    short s=i;//通不过
    由于翻译到第2行时不知道i的值是多少(即使上一行才定义),所以只能通过i的取值范围得出可能会丢失精度的判断,需要通过强制转换才能将i值赋给s。PS:最近查了下以前的课本,发现解释型语言生成中间代码的过程准确的说叫做翻译而不是编译,SUN提出Java编译器这个名称很可能只是为了混淆视听,让人忘了它是解释型语言这个本质……
      

  11.   

    谢谢suwei2002  同时也谢谢楼上各位!!!
      

  12.   

    suwei2002 哥解释的好高深啊,我是不是也该学学编译原理之类的东东啊