java~如何使用无符号整型

Posted 敢于对过去告一个段落,才有信心掀开新的篇章!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java~如何使用无符号整型相关的知识,希望对你有一定的参考价值。

在 Java 中,没有直接支持无符号整数的数据类型。Java 的基本数据类型(如 int、long、short、byte)都是带符号的,即它们可以表示正数和负数。

.net中每种整型都有对应的无符号类型,它不会把取值范围分成正负两个区间,只在正整数范围内取值

然而,你可以使用 Java 中的较大数据类型(如 long)来模拟无符号整数的行为。以下是一种常见的方法,用于将 32 位无符号整数的值存储在 Java 中的 long 类型中:

long unsignedInt = intValue & 0xFFFFFFFFL; // 无符号的32位整数

这里,intValue 是一个代表 32 位无符号整数的 int 值。通过与 0xFFFFFFFFL(十六进制)进行按位与运算,可以将 int 值转换为无符号整数,并将结果存储在 long 类型的变量 unsignedInt 中。

请注意,虽然使用 long 类型可以模拟无符号整数的行为,但它仍然需要占用 64 位内存空间。因此,如果你需要处理大量的无符号整数数据,可能会占用更多的内存。

另外,Java 8 引入了无符号整数支持的新类:java.util.BitSet。通过使用 BitSet 类,你可以处理和操作无符号整数值。你可以查阅 Java 官方文档以了解更多关于 BitSet 类的信息和用法。

请记住,在处理无符号整数时,你需要小心确保适当地处理数值范围、转换和运算,以避免数据溢出或错误的结果。

剑指offer知识点Java中无符号整型如何与int/long类型互相转化

[1] 结论

  Java中没有无符号数据类型(它就是这样设计的,我没查到为什么),byteshortintlong都是有符号数据类型。当我们逻辑上说一个数是无符号类型的话,往往代表我们说它的二进制符号位应该是要纳入计算的,而Java中把这个不该纳入计算的位置当成符号位,所以和我们现象中的数据不一致。特别注意:在Java中,负数以补码存储。

  解决办法就是提升类型,把符号位包裹在可计算位中:

int  toUnsignedInt(byte x)
long  toUnsignedLong(byte x)

[2] 举例说明无符号和有符号的区别

  如上图,8位负数-42的原码、反码、补码如图所示。假设我们在逻辑上认为Java中的byte类型的-42是一个无符号类型数字,那么它的实际数字应该是214,即它的补码的机器码大小。

  在Java中,由于负数以补码方式存储,所以负数提升为无符号数字时,是把它的补码的符号位纳入计算,而不是原码或者反码。

[3] 口算出无符号数

  如果想直接口算,可以使用:

负数时: 无符号数 = 2^n + 负数
正数时: 无符号数 = 正数

  8位负数-42的无符号数 = 2^8 + (-42) = 214。

以上是关于java~如何使用无符号整型的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer知识点Java中无符号整型如何与int/long类型互相转化

C语言中,64位无符号整型如何进行开方运算?

C语言中,64位无符号整型如何进行开方运算?

无符号整型和有符号整形转换

无符号整型和有符号整型的区别,以及无符号整型的使用

C语言里怎样理解长整型 短整型 和无符号型变量和常量?