等效于 C++ long long 的 BigInteger 值

Equivalent of BigInteger value of C++ long long

我正在将一些代码库从 C++ 迁移到 Java,在那里我遇到了我需要迁移的 C++ 代码中的 long long 值。

在一些研究中我发现我应该使用 BigInteger 来表示 C++ 的 long long

我看了几个例子,发现语法是:

static BigInteger flag1 = BigInteger.valueOf(0x00000001); 

这里我注意到 BigInteger.valueOf 参数中使用的值与原始 long long 值不同,后者是 0x0000000000000001LL

原始值有 16 位,而这个有 8 位,并且末尾不包含 LL 后缀。谁能解释一下这是怎么回事?

此外,如果他们可以用类似的术语建议 0x0000000000000200LL 的值。

请注意:所有这些零...都无关紧要。 0x1没有区别;和 0x001,依此类推。只要我们谈论的是数字

如果将它们表示为字符串,那将是另一回事;那么当然“0x1”与“0x01”不是同一个字符串。但是,他们不是。

您所有的值都是数字文字;它们都在一个范围内,甚至可以放入 Java 中的普通 long 值。

换句话说:leading 零数字对于数字来说无关紧要(除了像 010 这样的例子,它不是 10;因为从 0 开始表示八进制数)。

实际上更有趣的问题是:编译器为此将什么文字值放入 java 字节码。

0x0000000000000001LL == 0x00000001 == 0x1 == 1(十进制)

0x0000000000000200LL == 0x00000200 == 0x200 = 512(十进制)

这些是小值,可以表示为常规 int。

您也可以根据需要使用 BigInteger。

这里有很多东西要学:

  1. 你可能根本不需要在这里使用 BigInteger。 C++ long long 类型在大多数系统上是一个带符号的 64 位整数(参见 http://en.cppreference.com/w/cpp/language/types)。但是 Java 有一个 64 位有符号整数类型 - long。因此,除非您要移植为 long long 大于 64 位(!)的体系结构设计的 C++ 代码,否则您需要使用 Java long

  2. 前导零在 Java 中的十六进制文字(即 0x...)中无关紧要。

    (尽管它们对十进制文字很重要,因为前导零将 "decimal" 文字变成八进制文字......这改变了它的值。例如,文字 010 表示数字八个!)

  3. 如果你确实需要在 Java 中使用 64 位整型字面值,那么在右手端放一个 L。整数文字假定为 32 位。

  4. 在这样的上下文中,您尝试使用 BigInteger(long),无论如何,32 位整数文字将 扩大 为 64 位。


所以在你的情况下:

static BigInteger flag1 = BigInteger.valueOf(0x00000001); 
static BigInteger flag1 = BigInteger.valueOf(0x0000000000000001); 
static BigInteger flag1 = BigInteger.valueOf(0x1);
static BigInteger flag1 = BigInteger.valueOf(1);
static BigInteger flag1 = BigInteger.valueOf(1L);

都在说同样的话。这也是在说同样的话...

static BigInteger flag1 = BigInteger.valueOf(01);

...但这是个坏主意。它之所以有效,是因为八进制“1”和十进制“1”是相同的数字。


有人问:

The more interesting question would actually would be: what literal value the compiler puts into the java bytecode for that.

我不认为 JLS 指定了这一点,但它会使用长文字,因为这是 JVM 规范所要求的。