本人初学java,有很多搞不懂的问题,希望大家多多指教。  
 
 1. short s2 = (short)33330;    //33330默认是int类型
     System.out.println("s2的值是---->"+s2);//运行结果是-32206
  2.  int int2 = -3;
      byte b4 = (byte)int2;
      System.out.println("b4的值是---->"+b4);//运行结果是-3
  
 上面这两个问题运行结果都出来了,但就是搞不懂里面的运算过程。希望大家能够给我讲一下这里面的换算过程。非常感谢~~~

解决方案 »

  1.   

    第2个int类型强制转换byte类型 所以打印出来的b4是int2的值
      

  2.   

    1. short s2 = (short)33330;    //33330默认是int类型
         System.out.println("s2的值是---->"+s2);//运行结果是-32206知道short的字长 和 补码的概念么。
    你再分别试试看:
    short s2 = (short) 32767;
    short s2 = (short) 32768;
      

  3.   

    33330这个数(int型)的2进制表示是:
    00000000 00000000 10000010 00110010,进行short强制转换后,变成了:
    10000010 00110010,其最高位为1,就表示负数了。-32206。
      

  4.   

    第一个是short 能存储的最大范围是-32768~32767,最多能存储65536个数,
    33330超过了32767,相当于33330-65536=-32206
      

  5.   

    不用先转换成二进制,然后在换算成byte类型么?
      

  6.   

    数据类型转换一定要考虑位数的改变 int是32为而short是16位,从int转换为short会截掉一部分
    33330这个数(int型)的2进制表示是:
    00000000 00000000 10000010 00110010,进行short强制转换后,变成了:
    10000010 00110010,其最高位为1,就表示负数了。-32206。
      

  7.   

    嗯 这个问题好像搞懂了一点,之前主要是那个补码=反码+1,不知道该怎么运算,然后查了些资料和同学讨论了一下,差不多明白了。我接一下步骤你看下。
    33330转换成二进制是00000000,00000000,10000010,00110010
    强制转换成short是10000010,00110010(补码)
    因为符号位是1,所以是负数,对于负数又有补码=反码+1
    所以反码是:10000010,00110001(反码)
    所以再转换成源码就是:11111101,11001110(符号位不变,其余取反)
    所以转换成short就是32206(符号位不参与运算)
    因为是负数,所以是-32206。
    这个过程对吧,可是我算二楼的32768这个边界的数时,老弄混,还在计算中 呵呵
    谢谢帮忙哦~~
      

  8.   

    所有的转换都可以这样算么??
    例如:byte b2= (byte)385;
         System.out.println("b1的值是--->"+b2);//结果是-127
      

  9.   

    算不出来、、、、、
    32768转换成二进制是00000000,00000000,10000000,00000000
     强制转换成short是10000000,00000000(补码)
     因为符号位是1,所以是负数,对于负数又有补码=反码+1
     所以反码是:01111111,11111111(反码)
     所以再转换成源码就是:00000000,00000000(符号位不变,其余取反)
     结果没法计算了,不知道错在哪里,帮我看看。谢谢 嘿嘿
      

  10.   


    你把自己绕糊涂了吧?先算个简单的:◎ System.out.println((short) 65535);
    65535转换成二进制是00000000,00000000,11111111,11111111
    强制转换成short是11111111,11111111(补码)
    因为符号位是1,所以是负数,那么如何知道该补码所实际表示的负数是多少呢?
    很简单,前面带上符号“-”,然后整串取反再加一,如下:
    先取反:- 00000000,00000000
    再加一:- 00000000,00000001
    所以: -1◎ System.out.println((short) 32768);
    65535转换成二进制是00000000,00000000,10000000,00000000
    强制转换成short是10000000,00000000(补码)
    因为符号位是1,所以是负数,那么如何知道该补码所实际表示的负数是多少呢?
    很简单,前面带上符号“-”,然后整串取反再加一,即得:
    先取反:- 01111111,11111111
    再加一:- 10000000,00000000
    所以:-32768
      

  11.   


    恩恩 这个懂了。呵呵 下面这个是我自己算的步骤,可能咱们的方法不一样 不过你的那种挺简单的。我的这个也没问题吧? 
    33330转换成二进制是00000000,00000000,10000010,00110010
     强制转换成short是10000010,00110010(补码)
     因为符号位是1,所以是负数,对于负数又有补码=反码+1
     所以反码是:10000010,00110001(反码)
     所以再转换成源码就是:11111101,11001110(符号位不变,其余取反)
     所以转换成short就是32206(符号位不参与运算)
     因为是负数,所以是-32206。另外还有一种比较简单的,你看下 ,我也不确定是不是完全正确。
    short的取值范围是-32768~3276732768(要计算的数)超过这个范围了所以是负数,所以用32768-32767=1,然后再用32768-1+1=32768。所以最后就是-32768.我把同一个数用同样的颜色标出来。你看下对么。
      

  12.   

    都对。其实最后这一招正是 计算机采用补码的主要原因,因为这样可以把减法全部按照加法进行运算。也即: A - B => A + (-B)这样实际上CPU就只需要加法器就够了,不需要特别去设计一个 减法器。
      

  13.   

    byte 8位带符号数 -128—127
    short  16位带符号数 -32768—32767
    int    32位带符号数 -2147483648 — 2147483647 int ——short —— byte 这个过程需要强制类型转换,
    byte——short——int 这个过程不需要强制转换类型
      

  14.   

    System.out.println((int)(char)(byte) - 1)
    补上一道类似的
    你试着做吧。
    这道做出来了,其它的应该也就没问题了