Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中声明无符号int_Java_Integer_Unsigned - Fatal编程技术网

在Java中声明无符号int

在Java中声明无符号int,java,integer,unsigned,Java,Integer,Unsigned,有没有在Java中声明无符号int的方法 或者,这个问题也可以这样表述: 无符号的Java等价物是什么 我只是想告诉你我在看Java实现的String.hashcode()。我想测试如果整数是32个无符号整数,是否会发生冲突。Java没有用于的数据类型 如果需要存储较大的值,可以定义一个而不是int 您还可以将有符号整数当作无符号整数使用。的好处是,对于有符号整数和无符号整数,大多数操作(如加法、减法、乘法和左移位)在二进制级别上是相同的。然而,一些操作(分割、右移、比较和铸造)是不同的。从Ja

有没有在Java中声明无符号int的方法

或者,这个问题也可以这样表述: 无符号的Java等价物是什么


我只是想告诉你我在看Java实现的
String.hashcode()
。我想测试如果整数是32个无符号整数,是否会发生冲突。

Java没有用于的数据类型

如果需要存储较大的值,可以定义一个而不是
int

您还可以将有符号整数当作无符号整数使用。的好处是,对于有符号整数和无符号整数,大多数操作(如加法、减法、乘法和左移位)在二进制级别上是相同的。然而,一些操作(分割、右移、比较和铸造)是不同的。从Java SE 8开始,类中的新方法允许您充分使用
int
数据类型:

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


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

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

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

如果您想将一个int解释为无符号值(例如,您从
DataInputStream
读取一个int,您知道该int应该解释为无符号值),那么您可以执行以下技巧

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

请注意,十六进制文字是长文字,而不是整型文字,这一点很重要,因此结尾是“L”。

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

它们支持各种行动:

  • 加上
  • 减去
  • 时代
  • 国防部
  • 分开

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

我们需要无符号数字来建模MySQL的无符号
TINYINT
SMALLINT
INT
BIGINT
,这就是为什么我们创建了一个在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
,可以转换为高阶基本类型和
biginger
。希望这有帮助


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

也许这就是你的意思

long getUnsigned(int signed) {
    return signed >= 0 ? signed : 2 * (long) Integer.MAX_VALUE + 2 + signed;
}
  • getUnsigned(0)
    → 0
  • getUnsigned(1)
    → 一,
  • getUnsigned(Integer.MAX\u值)
    → 2147483647
  • getUnsigned(Integer.MIN\u值)
    → 2147483648
  • getUnsigned(Integer.MIN\u值+1)
    → 2147483649

对16位无符号整数使用
char

刚刚制作了这段代码,它将“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);
                    }
if(this.altura<0){
字符串aux=Integer.toString(this.altura);
char aux2[]=aux.toCharArray();
aux=“”;
对于(int con=1;con
似乎可以通过在使用值之前对值执行“逻辑AND”来处理签名问题:

示例(字节[]
头[0]
的值为
0x86
):

结果:

Integer -122 = 134

这里有很好的答案,但我没有看到任何按位操作的演示。正如Visser(目前公认的答案)所说,Java默认为整数签名(Java8有无符号整数,但我从未使用过它们)。不用再麻烦了,让我们做吧

RFC 868示例 如果需要将无符号整数写入IO,会发生什么情况?实际的例子是,当您想要根据输出时间时。这需要一个32位的大端无符号整数,该整数对1900年1月1日凌晨12:00以来的秒数进行编码。您将如何对其进行编码

按如下方式创建自己的无符号32位整数: 声明一个4字节(32位)的字节数组

这将初始化数组,请参见。现在,您必须以大端顺序(如果您想破坏浩劫,则以小端顺序)将信息填充到数组中的每个字节。假设您有一个名为
secondsSince1900
(它只使用前32位值,并且您已经处理了日期引用1970年1月1日凌晨12:00)的包含时间的长整数(长整数在Java中为64位长),那么您可以使用逻辑and从中提取位并将这些位移位到位置(数字)当以大端顺序合并为一个字节时,这一点不会被忽略

my32BitUnsignedInteger[0] = (byte) ((secondsSince1900 & 0x00000000FF000000L) >> 24); // first byte of array contains highest significant bits, then shift these extracted FF bits to first two positions in preparation for coersion to Byte (which only adopts the first 8 bits)
my32BitUnsignedInteger[1] = (byte) ((secondsSince1900 & 0x0000000000FF0000L) >> 16);
my32BitUnsignedInteger[2] = (byte) ((secondsSince1900 & 0x000000000000FF00L) >> 8);
my32BitUnsignedInteger[3] = (byte) ((secondsSince1900 & 0x00000000000000FFL); // no shift needed
我们的
my32bit unsignedinteger
现在相当于符合RCF 868标准的无符号32位大端整数。是的,长数据类型是有符号的,但我们忽略了这一事实,因为我们假设secondsSince1900只使用较低的32位)。由于将long合并为一个字节,所有高于2^7的位(十六进制的前两位)都将被忽略


参考资料来源:Java网络编程,第4版。

Java中没有未签名的类型。这篇文章可能会对您有所帮助
Byte my32BitUnsignedInteger[] = new Byte[4] // represents the time (s)
my32BitUnsignedInteger[0] = (byte) ((secondsSince1900 & 0x00000000FF000000L) >> 24); // first byte of array contains highest significant bits, then shift these extracted FF bits to first two positions in preparation for coersion to Byte (which only adopts the first 8 bits)
my32BitUnsignedInteger[1] = (byte) ((secondsSince1900 & 0x0000000000FF0000L) >> 16);
my32BitUnsignedInteger[2] = (byte) ((secondsSince1900 & 0x000000000000FF00L) >> 8);
my32BitUnsignedInteger[3] = (byte) ((secondsSince1900 & 0x00000000000000FFL); // no shift needed