程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

Guava无符号数支持(ffh无符号数)

balukai 2025-06-28 12:12:49 文章精选 2 ℃

Guava 提供了对无符号数的支持,这对于需要处理无符号整数的场景非常有用,因为 Java 本身并不直接支持无符号整数类型。Guava 中通过 UnsignedInteger 和 UnsignedLong 类来实现对无符号 int 和 long 类型的支持。这两个类位于 com.google.common.primitives 包中。

主要特点

  • UnsignedInteger: 这个类提供了对无符号 int 类型的支持。封装了一个 int 值,并且提供了一系列方法来操作这个无符号值,比如加法、减法、乘法、除法等。
  • UnsignedLong: 同样,这个类提供了对无符号 long 类型的支持。封装了一个 long 值,并且提供了类似的操作方法。

API说明

创建 UnsignedInteger 或 UnsignedLong:

  • 可以使用 fromIntBits(int bits) 方法创建一个 UnsignedInteger 实例,或使用 fromLongBits(long bits) 方法创建 UnsignedLong 实例。

执行算术运算:

  • 这些类提供了加法(plus)、减法(minus)、乘法(times)和除法(dividedBy)等方法来进行基本的算术运算。

比较:

  • 可以使用 compareTo 方法来比较两个无符号数值。

转换:

  • 可以将无符号整数转换为字符串表示形式,或者从字符串转换回无符号整数对象。

使用示例

  • 将一个有符号的 int 值视为无符号值进行操作,可以使用 UnsignedInteger :
import com.google.common.primitives.UnsignedInteger;
UnsignedInteger unsignedInt = UnsignedInteger.fromIntBits(0xFFFFFFFF); // 将int的最大值视为无符号数
System.out.println(unsignedInt); // 输出:4294967295
  • 无符号数的基本操作
package org.example;

import com.google.common.primitives.UnsignedInteger;

public class UnsignedExample {
    public static void main(String[] args) {
        // 创建两个UnsignedInteger实例,分别代表两个无符号整数值
        UnsignedInteger packetSize1 = UnsignedInteger.fromIntBits(0xFFFFFFFE); // 4294967294
        UnsignedInteger packetSize2 = UnsignedInteger.valueOf("255"); // 从字符串创建

        // 打印原始值
        System.out.println("Packet Size 1: " + packetSize1);
        System.out.println("Packet Size 2: " + packetSize2);

        // 执行加法操作
        UnsignedInteger totalSize = packetSize1.plus(packetSize2);
        System.out.println("Total Size (after addition): " + totalSize);

        // 比较两个无符号整数
        if (packetSize1.compareTo(packetSize2) > 0) {
            System.out.println("Packet Size 1 is larger than Packet Size 2.");
        } else {
            System.out.println("Packet Size 1 is not larger than Packet Size 2.");
        }

        // 将无符号整数转换为int类型(注意这可能导致溢出)
        int maxSizeAsInt = packetSize1.bigIntegerValue().intValue();
        System.out.println("Packet Size 1 as int: " + maxSizeAsInt);
    }
}

执行结果

Packet Size 1: 4294967294
Packet Size 2: 255
Total Size (after addition): 253
Packet Size 1 is larger than Packet Size 2.
Packet Size 1 as int: -2

说明

计算结果有溢出。原因是:Guava 的 UnsignedInteger 使用一个有符号的 int 类型来存储无符号整数。在逻辑上将 int 的 32 位当作无符号处理,但在进行加法等运算时,如果结果超过了 int 能表示的最大范围(即超过 Integer.MAX_VALUE),就会发生 溢出(overflow)。

建议

要做 大范围的无符号整数运算,建议使用:

BigInteger

或者确保数值不会超过 Integer.MAX_VALUE(即 2,147,483,647),否则很容易出现这种“看似合理却溢出”的错误。

注意事项

尽管 Guava 提供了这样的支持,但在设计系统时还是要考虑原始数据类型的限制和适用范围。

最近发表
标签列表