gpt4 book ai didi

java - 了解 Java 无符号数

转载 作者:搜寻专家 更新时间:2023-10-31 20:07:07 26 4
gpt4 key购买 nike

我想了解如何将有符号数转换为无符号数。

假设我有这个:

byte number = 127; // '1111111'

为了使其无符号,我必须选择“更大”的数据类型“短”并应用值为 0x00ff 的 AND 运算符。

short number2;  
number2 = number & 0x00ff;

为什么它使数字无符号?

最佳答案

Java 实际上没有未签名的原语。

值 127 实际上由 '01111111' 表示,第一位是符号(0 是正数)。

无符号字节可以容纳 0 到 255 之间的值,但 127 是有符号字节的最大值。由于一个字节有 8 位,带符号的字节占用一个字节来保存符号。因此,如果您想表示大于 127 的值,则需要使用具有更多位数的更大类型。更大的类型也有一个保留位用于符号,但它至少有 8 位用于实际值,因此您可以表示值 255。

也就是说,您应该避免使用 byte 和 short,因为它们存在问题。您会注意到我将结果转换为 short,因为运算符实际上返回了 int。您应该坚持使用 java 中的 int 和 long,因为它们实现得更好。

编辑:AND 运算符使其无符号,因为符号位是 short 的第一位,并且您将保存字节值的 8 位复制到 short 的最后 8 位。因此,如果您有一个负数,则第一位为 1(这意味着它是负数)实际上成为该值的一部分。并且短路将始终为正,因为其符号位处于受短路影响的 2 的幂的两倍高。

 byte:             10101101
||||||| <- actual value
short: 0000000010101101
||||||||||||||| <- actual value

编辑 2:请注意,因为负值使用 two's complement representation该值可能不是您所期望的。所有正值保持不变。
但是-128 = 0x10000000会变成128
-127 = 0x10000001 将变为 129
依此类推直到 -1 = 0x11111111 将变为 255

关于java - 了解 Java 无符号数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3388204/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com