另外下面两句中,前一句可以,而后一后不能通巡编译,为什么呢
float f=023.0f;//对
float f=0x23.0f;//错

解决方案 »

  1.   

    byte 的范围是-128~127
    300=256+44
    当然是44了
      

  2.   

    为什么 System.out.println((byte)128) 的结果是-128
      

  3.   

    数字是以补码二进制表示的,300本来是十六位的int,用十六位补码表示就是0000000100101100,将其强制转换成八位补码就成00101100了,将其转换成十进制,不就是44吗?
    0x打头的是十六进制数,而十六进制数是没有小数的,也就是说不能带小数点的,0x23.0当然错误
      

  4.   

    128(int)->0000000010000000(16bit) -> 10000000(8bit) -> -128(byte)
      

  5.   

    看来有必要解释一下补码是怎么回事了。
    补码二进制使用最高位作为符号位,0表示正,1表示负,即00000001是正数,10000001是负数
    将十进制转换成补码的规则是这样的:
    先将十进制数除去符号转换成普通的二进制,其位数为总位数减一,这里的总位数就是指用多少位去表示这个数,因为最高位用来表示符号,故减去1。如16位int数转换,在这里就是15位,最高位是符号位。
    然后,如果是正数的话不变。如果是负数的话,所有位取反,然后最低位加1,得到的结果最高位若有进位,则去掉。
    最后将符号位加到最高位,就得到了补码二进制数。
    如-128,若转换成8位二进制是10000000,去掉最高位,剩下的是7位的0000000,取反得到1111111,最低位加1得到8位的10000000,最高位有进位,去掉进位,得到7位的0000000,把符号位放到最高位,得到8位的10000000
      

  6.   

    上面说错了,128是不能用8位表示的,它首先被转换成16位的二进制补码,流程就如我以上说的:
    128(int)->0000000010000000(16bit) -> 10000000(8bit) -> -128(byte)