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中没有无符号数据类型(它就是这样设计的,我没查到为什么),byte
,short
,int
和long
都是有符号数据类型。当我们逻辑上说一个数是无符号类型的话,往往代表我们说它的二进制符号位应该是要纳入计算的,而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~如何使用无符号整型的主要内容,如果未能解决你的问题,请参考以下文章