【问题标题】:Understanding Java unsigned numbers理解 Java 无符号数
【发布时间】:2010-08-02 13:28:59
【问题描述】:

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

可以说我有这个:

byte number = 127; // '1111111'

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

short number2;  
number2 = number & 0x00ff;

为什么它使数字无符号?

【问题讨论】:

    标签: java byte unsigned


    【解决方案1】:

    Java 实际上没有无符号原语。

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

    无符号字节可以保存 0 到 255 的值,但 127 是有符号字节的最大值。由于一个字节有 8 位,带符号的字节消耗 1 位来保存符号。 因此,如果要表示大于 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

    【讨论】:

    • 有关字节和短的问题的任何链接?我偶尔使用过字节,但从未真正使用过短。
    • @DeanJ:我认为问题在于性能,因为您需要更多的演员,因为许多操作返回 int。
    • Java 确实有一个无符号的原始类型,它被称为“char”:) 虽然大多数时候它的范围有点有限。
    • 不,看我的编辑2; -127 是 10000001;第一个 1 表示它是负数,而 0000001 表示它是用二进制补码表示的(0000001 = 2^n - 127;其中 n 是类型的位数,在字节 n=8 的情况下);所以它是 11111111 AND 10000001 是 129
    • @shlomjmi;许多语言使用二进制补码,因为将数字加在一起非常快。 00000001(一)加上 11111110(负一)= 00000000(零)。你可以把 &(and) 的东西加在一起,带上溢出就行了。
    【解决方案2】:

    java 没有无符号数据类型。您只需切换到“更大”的数据类型,仅此而已。

    【讨论】:

    • 我问这个 AND 操作是如何使它无符号的
    • 它不会使其成为无符号类型。使用移位魔法可以达到的最大效果就是扔掉减号。但这并不能使它成为无符号类型。无论如何,你认为这是怎么发生的? Bitshifting 会在 JVM 中意外创建新的子类或 hack?
    【解决方案3】:

    如果您只是从负字节移动到 int,则 int 也将是负数。所以你取负整数(或你的例子中的短整数)并将最高 3 字节(整数)设置为 0x00。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      • 2021-12-22
      • 2010-10-13
      • 1970-01-01
      相关资源
      最近更新 更多