有没有办法在Java中声明unsigned int?
或者问题也可以这样构成:Java等同于unsigned?
只是告诉你我正在研究Java的 String.hashcode() 实现的上下文 . 如果整数是32 unsigned int,我想测试碰撞的可能性 .
String.hashcode()
int中的值是有符号还是无符号取决于位的解释方式 - Java将位解释为有符号值(它没有无符号的原语) .
如果您想要将int解释为无符号值(例如,您从DataInputStream中读取包含无符号值的int),那么您可以执行以下操作 .
int fourBytesIJustRead = someObject.getInt(); long unsignedValue = fourBytesIJustRead & 0xffffffffl;
注意,重要的是hex文字是一个长文字,而不是一个int文字 - 因此最后是'l' .
Java没有unsigned integers的数据类型 .
如果需要存储大值,可以定义long而不是 int .
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 类中的那些方法进行无符号算术 .
Integer
有一个API for unsigned Integer and Long in Java 8!
我们需要无符号数来模拟jOOQ中MySQL的无符号 TINYINT , SMALLINT , INT , BIGINT ,这就是为什么我们创建了jOOU,这是一个为Java中的无符号整数提供包装类型的简约库 . 例:
TINYINT
SMALLINT
INT
BIGINT
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 . 希望这可以帮助 .
java.lang.Number
BigInteger
(免责声明:我为这些图书馆背后的公司工作)
对于无符号数,您可以使用 Guava library 中的这些类:
UnsignedInteger
UnsignedLong
他们支持各种操作:
加
减去
次
mod
divideBy
目前似乎缺少的是字节移位运算符 . 如果您需要那些,可以使用Java中的BigInteger .
使用 char 表示16位无符号整数 .
char
也许这就是你的意思?
long getUnsigned(int signed) { return signed >= 0 ? signed : 2 * (long) Integer.MAX_VALUE + 2 + signed; }
getUnsigned(0) →0
getUnsigned(0)
getUnsigned(1) →1
getUnsigned(1)
getUnsigned(Integer.MAX_VALUE) →2147483647
getUnsigned(Integer.MAX_VALUE)
getUnsigned(Integer.MIN_VALUE) →2147483648
getUnsigned(Integer.MIN_VALUE)
getUnsigned(Integer.MIN_VALUE + 1) →2147483649
getUnsigned(Integer.MIN_VALUE + 1)
刚刚制作了这段代码,将“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); }
您似乎可以通过在使用它们之前对值进行“逻辑AND”来处理签名问题:
示例( byte[] header[0] 的值为 0x86 ):
byte[]
header[0]
0x86
System.out.println("Integer "+(int)header[0]+" = "+((int)header[0]&0xff));
结果:
Integer -122 = 134
您可以使用Math.abs(数字)函数 . 它返回一个正数 .
10 回答
int中的值是有符号还是无符号取决于位的解释方式 - Java将位解释为有符号值(它没有无符号的原语) .
如果您想要将int解释为无符号值(例如,您从DataInputStream中读取包含无符号值的int),那么您可以执行以下操作 .
注意,重要的是hex文字是一个长文字,而不是一个int文字 - 因此最后是'l' .
Java没有unsigned integers的数据类型 .
如果需要存储大值,可以定义long而不是
int
.您也可以使用带符号的整数,就好像它是无符号的一样 . two's complement representation的好处是大多数操作(例如加法,减法,乘法和左移)在二进制级别上对于有符号和无符号整数是相同的 . 然而,一些操作(除法,右移,比较和铸造)是不同的 . 从Java SE 8开始,Integer类中的新方法允许您完全使用
int
数据类型to perform unsigned arithmetic:请注意,
int
变量在声明时仍然是有符号的,但现在可以使用Integer
类中的那些方法进行无符号算术 .有一个API for unsigned Integer and Long in Java 8!
我们需要无符号数来模拟jOOQ中MySQL的无符号
TINYINT
,SMALLINT
,INT
,BIGINT
,这就是为什么我们创建了jOOU,这是一个为Java中的无符号整数提供包装类型的简约库 . 例:所有这些类型都扩展
java.lang.Number
并且可以转换为更高阶的基本类型和BigInteger
. 希望这可以帮助 .(免责声明:我为这些图书馆背后的公司工作)
对于无符号数,您可以使用 Guava library 中的这些类:
UnsignedInteger
UnsignedLong
他们支持各种操作:
加
减去
次
mod
divideBy
目前似乎缺少的是字节移位运算符 . 如果您需要那些,可以使用Java中的BigInteger .
使用
char
表示16位无符号整数 .也许这就是你的意思?
getUnsigned(0)
→0getUnsigned(1)
→1getUnsigned(Integer.MAX_VALUE)
→2147483647getUnsigned(Integer.MIN_VALUE)
→2147483648getUnsigned(Integer.MIN_VALUE + 1)
→2147483649刚刚制作了这段代码,将“this.altura”从负数转换为正数 . 希望这可以帮助有需要的人
您似乎可以通过在使用它们之前对值进行“逻辑AND”来处理签名问题:
示例(
byte[]
header[0]
的值为0x86
):结果:
您可以使用Math.abs(数字)函数 . 它返回一个正数 .