java中有趣的未签名

java中有趣的未签名,java,Java,我发现无符号整数在Java中是如此的直截了当。如果我想显示0xFXXX XXXX,Java要求我声明一个长变量来存储0xFXXX XXXX,并对42949672950xFFFFFFFFFFL执行位and操作。 任何人都可以将您关于未签名问题的经验分享给其他人或我 可能要检查以下内容: C++: Java等价物: int b = ...; b = (b + 100) & 0xff; long v = ...; v = (v * 2) & 0xffffffffL; 使用无符号值时

我发现无符号整数在Java中是如此的直截了当。如果我想显示0xFXXX XXXX,Java要求我声明一个长变量来存储0xFXXX XXXX,并对42949672950xFFFFFFFFFFL执行位and操作。
任何人都可以将您关于未签名问题的经验分享给其他人或我

可能要检查以下内容:

C++:

Java等价物:

int b = ...;
b = (b + 100) & 0xff;

long v = ...;
v = (v * 2) & 0xffffffffL;
使用无符号值时,将其强制转换为所需的类型,它将自然换行,从而为您提供正确的值:

// Example: write an unsigned int (stored in a long)
// to a byte buffer.
ByteBuffer bb = ...
long unsignedInt = ...
bb.putInt((int) unsignedInt);
在java中,整数的长度为32位;然而,第一位是符号。实际上,整数只有31位长

您的号码为正32位长数字;因此,它不能适合整数,因此需要一个长的

编辑:为什么投否决票

对于简单的8位字,整数表示为2的补码:

MSB 0 1 1 1 1 1 1 1 = 127 0 1 1 1 1 1 1 0 = 126 0 0 0 0 0 0 1 0 = 2 0 0 0 0 0 0 0 1 = 1 0 0 0 0 0 0 0 0 = 0 1 1 1 1 1 1 1 1 = −1 1 1 1 1 1 1 1 0 = −2 1 0 0 0 0 0 0 1 = −127 1 0 0 0 0 0 0 0 = −128 MSB,第一个数字有效地指示符号


编辑2:我厌倦了讨论一个没有实际意义的问题。在进行向下表决之前,请参阅Java使用最常用的表示有符号整数的方法-

Java没有无符号类型,您需要自己考虑这些类型。如果你假设无符号,那么,好吧,不要。作为一个助手,Google确实在他们的公共域Guava库中为位操作提供了方便的方法,检查SignedBytes和UnsignedBytes类;不需要声明长变量。感谢您共享的Esko,guava库非常棒~@Ingo-您确定本例中的变量名不是“unsigned”吗名称是无符号的,它的名称实际上既没有无符号也没有符号-这完全取决于它的使用方式。事实并非如此。您可以在32位有符号整数中保存32位无符号整数。它是否有符号只与特定的关系运算和输出有关。然而,举例来说,无论发生什么,加法都是一样的。这是2s补码的优点。它与许多操作相关。只有将int添加到long中,加法才能起作用。@Ingo:运行这段代码:{int x=2147483647;System.out.printlnx+1;x++;System.out.printlnx;}@CMR-那又怎样?你似乎混淆了外在表现和内在表现。我说过,一般来说,在每次转换中都必须注意输出。@Ingo,您的评论是错误的,因为第一位是符号,很容易被符号和值而不是2补码混淆,它们完全不同。这个片段在这些语句中有一个问题,long v=。。。;v=v*2&0xffffffff;“v”应始终等于-1。我们必须使用“&0xFFFFFFFFFFL”。 MSB 0 1 1 1 1 1 1 1 = 127 0 1 1 1 1 1 1 0 = 126 0 0 0 0 0 0 1 0 = 2 0 0 0 0 0 0 0 1 = 1 0 0 0 0 0 0 0 0 = 0 1 1 1 1 1 1 1 1 = −1 1 1 1 1 1 1 1 0 = −2 1 0 0 0 0 0 0 1 = −127 1 0 0 0 0 0 0 0 = −128