`
darrenzhu
  • 浏览: 784364 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

无符号字节类型,unsigned byte 转换

    博客分类:
  • Java
阅读更多
原码, 反码和补码详细知识参考:
http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html

要点:
计算机内存中存储的是带符号位的二进制补码。

十进制字面常量具有一个很好的属性,即所有的十进制字面常量都是正的,而十六进制或是八进制字面常量并不具有着个属性。更进一步说,就是一个十六进制和八进制的字面常量无需显示的(-)负号就可以表示负的数值,而十进制的负数是明确需要一个负号来表示的。

int a = 10;
int b = -10;
int c = 0xAAAAAAAA;
如上所示,a和b是用十进制字面常量赋的值,我们很容易区别a是正数,b是负数.但是c是用十六进制字面常量赋的值,System.out.print(c)为-1431655766,所以c是一个负数,c的正负并没有显示的负号来表达。

java中的byte类型是signed有符号的,范围-128 - 127, 如果需要输出或比较无符号的byte,怎么办?

byte a = 0xAA 编译报错,因为0xAA是一个十六进制字面常量,它代表的值是十进制的170,不在-128-127之间,所以要强制转换。byte a = (byte)0xAA 就ok了。但是此时的System.out.print(a)为-86,如果希望System.out.print(a)为170,咋办?
System.out.print(a & 0xFF)即可,a & 0xFF是一个int型的,而且符号为正。


如果希望大印出0xAA,怎么办,可以用如下的方法
public static String fromUnsignedByteToHexString(byte b) {
return "0x" + Integer.toHexString(b & 0xFF).toUpperCase();
}

这里有一个关键点,虽然byte a = (byte)0xAA打印出来的是-86,但其实计算机内存中存储的确实正确的无符号的二进制。0xAA是int型的,java中占4个字节
十六进制表示
00 00 00 AA
强制转换成byte类型,占一个字节为
AA
AA用无符号解析出来就是170
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics