java定义二进制数_Java 基本类型与二进制数位的本质

1.Java中的基本类型以二进制补码的形式表示,最高位为符号位:

如12,  用二进制表示为:0000 1100

而-125, 用二进制表示为:1000 0011

另补充原码,反码,补码的含义:

原码:将一个整数,转换成二进制,就是其原码。

如单字节的5的原码为:0000 0101;-5的原码为1000 0101。

反码:正数的反码就是其原码;负数的反码是将原码中,除符号位以外,每一位取反。

如单字节的5的反码为:0000 0101;-5的反码为1111 1010。

补码:正数的补码就是其原码;负数的反码+1就是补码。

如单字节的5的补码为:0000 0101;-5的原码为1111 1011。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值