无符号字节类型,unsigned byte 转换 博客分类: Java byte字节类型无符号十进制
程序员文章站
2024-03-18 15:38:58
...
原码, 反码和补码详细知识参考:
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
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