Java 基本类型与二进制数位的本质


1.Java中的基本类型以二进制补码的形式表示,最高位为符号位:
  如12,  用二进制表示为:0000 1100
  而-125, 用二进制表示为:1111 1101

2.整数的移位操作会默认先转型为4字节int或8字节的long,然后再运算.
  写一个二进制数:0xAF,默认它是int类型,如果把它赋值给一个byte:
  byte = 0xAF,(二进制为1010 1111) 它会出错,因为byte可以表示的数的范围为-128至127,而0xAF默认作为int看待是175,显然超出了它的范围。
  但0xAF确实是一个字节的宽度,按道理讲它是可以放进一个字节里的。如果要把它存入一个byte,必须把它从默认的int转为byte:
  byte b = (byte) 0xAF  // 1010 1111
  这样就相当于把int前面的三字节截断了,此时把它当作是一个有符号的一字节的数来看,首位为1表示是负数,而且特别注意它是补码的表示形式,把它
  还原为原码后可以得出它表示的数为-81.
  总结:一串二进制数,它在计算机中存放时,它的形式虽然没有变化,但是把它当作不同的类型来解读,它表示的数据是不一样的,如上所示,一串
  1010 1111,把它看作是int它表示的是175,把它看作byte,它可以表示为-81.

3.还是以上二进制串1010 1111,把它存放在一个byte中:
  byte b = (byte) 0xAF
  此时如果要把它解释为一个int型的数,即在它左边扩展3个0字节,凑足4个字节,把它当作int整型来解读,如果再把它强制类型转换:
  int a = (int) b
  但此时a还是等于-81,不是我们所愿的,这是因为第一步已经确认解读它为一个字节的有符号数了,值是确定的,再转型为int时,它是包含在int表示范围内的。
  相当于把它赋值给a。
  但如果我们还是想把一个字节的内容解读为一个int值或者一个无符号的数呢?应该怎么做?
  其实此时应该把一个字节先扩展为int的四个字节,然后去掉它的前导符号位1:
  int a = b & 0x000000FF //注意byte b在逻辑运算之前会默认转型为int:0xffffffaf (-81的补码),类型提升时符号位的1会一直扩展到最高位,
  而逻辑与会去掉符号位和前导的一串1, 此时a就是一个无符号数了,值为175.



参考:
http://download.csdn.net/download/aggrision/2372349
http://blog.163.com/zhuowh2006@126/blog/static/10182372420127189208459/
http://www.cnblogs.com/dolphin0520/archive/2012/10/09/2711768.html

你可能感兴趣的:(Java 基本类型与二进制数位的本质)