java - 为什么0x000F存储为无符号?

时间:2016-02-04 05:03:25

标签: java unsigned

我正在阅读试图理解如何将有符号字节转换为无符号整数计数器部分的示例。

我遇到的最流行的方法是:

a & 0xFF

其中a是带符号的字节。

我的问题是为什么0xFF存储为无符号?是否所有十六进制值都存储为无符号?如果是这样的话?

"和" -ing如何关闭符号整数中的符号位?

如果有人可以一步一步地分解这个过程,那就太好了。

3 个答案:

答案 0 :(得分:4)

您可能在将字节转换为整数的代码中看到了这一点,他们希望将该字节视为0-255范围内的无符号值。它一般不适用于整数。如果你想要一个整数a“unsigned”,你可以这样做:

int unsignedA = a & 0x7FFFFFFF;

这将确保unsignedA为正 - 但它通过切断高位来实现,例如,如果a为-1,则unsignedA为Integer.MAX_VALUE

无法将32位带符号的Java整数转换为32位无符号Java整数,因为Java中没有32位无符号整数的数据类型。 Java中唯一的无符号整数数据类型是16位长:char

如果要在Java中存储32位无符号整数值,则需要将其存储在long

long unsignedA = a & 0xFFFFFFFFL;

答案 1 :(得分:2)

详细说明Erwin关于将字节转换为整数的答案:在Java中,byte是有符号整数类型。这意味着它的值在-128到127之间。如果你说:

byte a;
int b;
a = -64;
b = a;

语言将保留价值;也就是说,它会将b设置为-64。

但是如果你真的想把你的字节转换为0到255之间的值(我猜你称之为"无符号对应物"字节值),你可以使用a & 0xFF。这里发生了什么:

Java不直接对byteshort类型进行算术运算。因此,当它看到a & 0xFF时,它会将双方转换为inta的十六进制值(一个字节)看起来像

a      =       C0

当它被转换为32位整数时,必须保留值(-64),这意味着32位整数必须在高24位中有1位。因此:

a      =       C0
(int)a = FFFFFFC0

然后你"和"它与0xFF

a      =       C0
(int)a = FFFFFFC0
       & 000000FF
         --------
a & FF = 000000C0

结果是一个0到255范围内的整数。

答案 2 :(得分:0)

在Java中,文字(1,0x2A等)是正数,除非您明确指出它们是否定的。这就是我们直观地写数字的方式。

上一个问题回答了有关转换为无符号的问题。 Understanding Java unsigned numbers