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

java - Why is 0x000F stored as unsigned?

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

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

a & 0xFF

其中 a 是带符号的字节。

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

以及"and"-ing如何关闭符号整数中的符号位?

如果有人能一步一步分解这个过程就太好了。

您可能在将字节转换为整数的代码中看到了这一点,他们希望将字节视为 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;

在 Java 中,文字(1、0x2A 等)为正,除非您明确指出它们为负。这就是我们凭直觉写数字的方式。

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

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

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

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

但是如果你真的想把你的字节转换成一个从0到255的值(我猜你称之为字节值的"unsigned counterpart"),你可以使用a & 0xFF。这是发生了什么:

Java 不会直接对 byteshort 类型进行算术运算。所以当它看到 a & 0xFF 时,它会将两边都转换为 inta 的十六进制值是一个字节,看起来像

a      =       C0

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

a      =       C0
(int)a = FFFFFFC0

但是你 "and" 它与 0xFF:

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

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