Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.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 有符号与无符号的区别_Java_Unsigned Integer - Fatal编程技术网

Java 有符号与无符号的区别

Java 有符号与无符号的区别,java,unsigned-integer,Java,Unsigned Integer,我已经搜索并阅读了许多关于这种差异的以前的答案,但我仍然没有得到一些东西,例如这行代码: System.out.println(Integer.parseUnsignedInt("11111111111111111111111111111111", 2)); 我读到,Unsigned可以保存更大的正值,而不是负值。Unsigned使用前导位作为值的一部分,而signed版本使用最左边的位来标识数字是正数还是负数。有符号整数可以同时包含正数和负数。一个未签名的可以大于MAX_值,那么为什么sys

我已经搜索并阅读了许多关于这种差异的以前的答案,但我仍然没有得到一些东西,例如这行代码:

System.out.println(Integer.parseUnsignedInt("11111111111111111111111111111111", 2));
我读到,Unsigned可以保存更大的正值,而不是负值。Unsigned使用前导位作为值的一部分,而signed版本使用最左边的位来标识数字是正数还是负数。有符号整数可以同时包含正数和负数。一个未签名的可以大于MAX_值,那么为什么sysout给出-1,这是负数呢。对于该行代码:


System.out.println(Integer.parseInt("11111111111111111111111111111111", 2));
为什么这一行给出32乘以1的错误?一个有符号的整数不应该把第一个1当作负数,把另外31个1当作正值吗?所以它应该给出-MAX_值

为什么这一行给出32乘以1的错误?不是一个有符号的整数 假设将第一个1视为负数,将其他31个1视为负数 正值?所以它应该给出-MAX_值

它抛出NumberFormatException的原因与

Integer.parseInt("2147483648", 10)
是的。当根据指定的基数进行解释时,字符串不表示可以表示为int的数字。int使用32位来表示值只是与外围设备相关。如果要使用Integer.parseInt解析负值,则字符串应包含前导减号:

Integer.parseInt("-1111111111111111111111111111111", 2)
甚至

Integer.parseInt("-10000000000000000000000000000000", 2)  // note: 32 digits
该方法不是将位直接映射到int表示。它将字符串解释为数字的文本表示形式

一个无符号的值可能会大于MAX_值,那么为什么sysout会给出这个值呢 -1是负数

整数包含一个32位的值。parseUnsignedInt32的结果为1位,2是设置了所有位的值。这意味着在旁观者的眼中。大多数Java都认为整数值是有符号的。例如,println使用的格式化程序将该值视为有符号的,结果为-1

整数的“内部”只有一个32位的值。parseUnsignedInt专门处理其输入参数,但随后必须将结果存储在标准整数中。没有什么可以说这些位应该是“无符号的”。如果要将该值视为无符号,则不能使用任何将其视为有符号的值,因为Java实际上没有无符号整数类型

一个有符号的整数不应该把前一个1当作负号吗 其他31个1作为正值?所以它应该给出-MAX_值

这部分见其他答案

我想你期望的表示法,高位表示符号,其余位表示正值,叫做符号和幅值表示法。我不知道现在有哪台计算机对其整数使用符号和大小可能发生在20世纪50年代左右的早期,当时人们正在着手处理这些东西。

Java没有无符号整数类型。当您调用parseUnsignedInt时,它不会返回无符号整数,因为java中没有这样的东西

相反,ParseUnsignedIt将输入解析为无符号32位值,然后返回具有相同位的有符号32位值


如果您为它提供了一个在其无符号表示中设置了前导位的数字,那么它将返回一个负数,因为所有设置了该位的有符号数字都是负数。

@markspace第二个参数指定了本例中的基数2,因此它会处理二进制。哦,对不起。没有一直向右滚动,因此没有看到第二个参数。也许OP应该把那些长队分开?但无论如何,第二个版本仍然不使用位,它将使用负号,就像十进制版本一样。有符号整数表示法使用前导位作为负号是不正确的。在有符号和无符号情况下,它都是值的一部分。在无符号整数中,前导位值为2^31。在有符号整数中,它值-2^31。这是唯一的区别。但我仍然不明白,如果unsigned int只包含正整数,它怎么会给出负整数,换句话说,为什么在32位的情况下,parseunsigned不会将字符串解释为2的补码?通常,有符号整数应该被解释为2的补码。整数中没有任何内容可以说明这些位是如何到达那里的——从一个将它们视为无符号位的函数或从一个将它们视为有符号位的函数。因此,格式化代码以常规Java方式将其视为有符号值。@Ino,因为Integer.parseUnsignedInt将该值解析为32位的无符号整数,然后将结果映射为int,使用将Integer.MAX_值+1和Integer.MAX_值*2+1的算术值之间的正值表示为负数的映射。它的文档中描述了这一点,但事实上,这有点奇怪,这可能是该方法的原因
在Java8之前不存在。然而,如果该方法不这样做,它就没有任何意义,因为整数.MAX_值以上的数字没有整数表示。我知道java将整数解释为有符号的,这就是我不理解的原因。我使用了parseUnsignedInt,这样我就可以得到一个无符号的解释,但是在32位的情况下,它仍然给了我一个2的补码,相当于有符号的,因此,如果这种方法在所有情况下都不给我未签名的解释,那么它就毫无意义。更新了我的答案,希望进一步解释它。投票结果表明,我试图表达的内容更加简洁。