等效于 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。
这里有很多东西要学:
你可能根本不需要在这里使用 BigInteger
。 C++ long long
类型在大多数系统上是一个带符号的 64 位整数(参见 http://en.cppreference.com/w/cpp/language/types)。但是 Java 有一个 64 位有符号整数类型 - long
。因此,除非您要移植为 long long
大于 64 位(!)的体系结构设计的 C++ 代码,否则您需要使用 Java long
。
前导零在 Java 中的十六进制文字(即 0x...
)中无关紧要。
(尽管它们对十进制文字很重要,因为前导零将 "decimal" 文字变成八进制文字......这改变了它的值。例如,文字 010
表示数字八个!)
如果你确实需要在 Java 中使用 64 位整型字面值,那么在右手端放一个 L
。整数文字假定为 32 位。
在这样的上下文中,您尝试使用 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 规范所要求的。
我正在将一些代码库从 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。
这里有很多东西要学:
你可能根本不需要在这里使用
BigInteger
。 C++long long
类型在大多数系统上是一个带符号的 64 位整数(参见 http://en.cppreference.com/w/cpp/language/types)。但是 Java 有一个 64 位有符号整数类型 -long
。因此,除非您要移植为long long
大于 64 位(!)的体系结构设计的 C++ 代码,否则您需要使用 Javalong
。前导零在 Java 中的十六进制文字(即
0x...
)中无关紧要。(尽管它们对十进制文字很重要,因为前导零将 "decimal" 文字变成八进制文字......这改变了它的值。例如,文字
010
表示数字八个!)如果你确实需要在 Java 中使用 64 位整型字面值,那么在右手端放一个
L
。整数文字假定为 32 位。在这样的上下文中,您尝试使用
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 规范所要求的。