首页 文章

在Java中声明unsigned int

提问于
浏览
263

有没有办法在Java中声明unsigned int?

或者问题也可以这样构成:Java等同于unsigned?

只是告诉你我正在研究Java的 String.hashcode() 实现的上下文 . 如果整数是32 unsigned int,我想测试碰撞的可能性 .

10 回答

  • 7

    int中的值是有符号还是无符号取决于位的解释方式 - Java将位解释为有符号值(它没有无符号的原语) .

    如果您想要将int解释为无符号值(例如,您从DataInputStream中读取包含无符号值的int),那么您可以执行以下操作 .

    int fourBytesIJustRead = someObject.getInt();
    long unsignedValue = fourBytesIJustRead & 0xffffffffl;
    

    注意,重要的是hex文字是一个长文字,而不是一个int文字 - 因此最后是'l' .

  • 260

    Java没有unsigned integers的数据类型 .

    如果需要存储大值,可以定义long而不是 int .

    您也可以使用带符号的整数,就好像它是无符号的一样 . two's complement representation的好处是大多数操作(例如加法,减法,乘法和左移)在二进制级别上对于有符号和无符号整数是相同的 . 然而,一些操作(除法,右移,比较和铸造)是不同的 . 从Java SE 8开始,Integer类中的新方法允许您完全使用 int 数据类型to perform unsigned arithmetic

    在Java SE 8及更高版本中,您可以使用int数据类型来表示无符号的32位整数,其最小值为0,最大值为2 ^ 32-1 . 使用Integer类将int数据类型用作无符号整数 . 已经将诸如compareUnsigned,divideUnsigned等静态方法添加到Integer类中,以支持无符号整数的算术运算 .

    请注意, int 变量在声明时仍然是有符号的,但现在可以使用 Integer 类中的那些方法进行无符号算术 .

  • 1
  • 18

    我们需要无符号数来模拟jOOQ中MySQL的无符号 TINYINTSMALLINTINTBIGINT ,这就是为什么我们创建了jOOU,这是一个为Java中的无符号整数提供包装类型的简约库 . 例:

    import static org.joou.Unsigned.*;
    
    // and then...
    UByte    b = ubyte(1);
    UShort   s = ushort(1);
    UInteger i = uint(1);
    ULong    l = ulong(1);
    

    所有这些类型都扩展 java.lang.Number 并且可以转换为更高阶的基本类型和 BigInteger . 希望这可以帮助 .

    (免责声明:我为这些图书馆背后的公司工作)

  • 1

    对于无符号数,您可以使用 Guava library 中的这些类:

    他们支持各种操作:

    • 减去

    • mod

    • divideBy

    目前似乎缺少的是字节移位运算符 . 如果您需要那些,可以使用Java中的BigInteger .

  • 58

    使用 char 表示16位无符号整数 .

  • -18

    也许这就是你的意思?

    long getUnsigned(int signed) {
        return signed >= 0 ? signed : 2 * (long) Integer.MAX_VALUE + 2 + signed;
    }
    
    • getUnsigned(0) →0

    • getUnsigned(1) →1

    • getUnsigned(Integer.MAX_VALUE) →2147483647

    • getUnsigned(Integer.MIN_VALUE) →2147483648

    • getUnsigned(Integer.MIN_VALUE + 1) →2147483649

  • 64

    刚刚制作了这段代码,将“this.altura”从负数转换为正数 . 希望这可以帮助有需要的人

    if(this.altura < 0){    
    
                            String aux = Integer.toString(this.altura);
                            char aux2[] = aux.toCharArray();
                            aux = "";
                            for(int con = 1; con < aux2.length; con++){
                                aux += aux2[con];
                            }
                            this.altura = Integer.parseInt(aux);
                            System.out.println("New Value: " + this.altura);
                        }
    
  • 1

    您似乎可以通过在使用它们之前对值进行“逻辑AND”来处理签名问题:

    示例( byte[] header[0] 的值为 0x86 ):

    System.out.println("Integer "+(int)header[0]+" = "+((int)header[0]&0xff));
    

    结果:

    Integer -122 = 134
    
  • 4

    您可以使用Math.abs(数字)函数 . 它返回一个正数 .

相关问题