我正在将一些代码库从C ++迁移到Java,在那里我遇到了需要迁移的C ++代码中的long long
值。
在一些研究中,我发现我应该使用BigInteger
来表示C ++的long long
。
我看了几个例子,发现了语法:
static BigInteger flag1 = BigInteger.valueOf(0x00000001);
这里我注意到BigInteger.valueOf参数中使用的值与long long
0x0000000000000001LL
值不同
原始值有16位数字,这个数字有8位数字,最后不包含LL
后缀。有人可以解释发生了什么吗?
此外,如果他们可以用类似的术语建议0x0000000000000200LL
的价值。
答案 0 :(得分:3)
请注意:所有这些零......不重要。 0x1之间没有区别;和0x001,依此类推。只要我们谈论数字。
如果将它们表示为字符串,那将是另一回事;然后是coursre" 0x1"与" 0x01"不是同一个字符串。但是,他们不是。
您的所有值都是数字文字;它们都在一个甚至适合Java中普通 long 值的范围内。
换句话说:前导零数字与数字无关(除了像010这样的例子,不是10;因为起始0表示八进制数字)。
实际上更有意思的问题是:编译器将哪个字面值放入java字节码中。
答案 1 :(得分:2)
0x0000000000000001LL == 0x00000001 == 0x1 == 1(dec)
0x0000000000000200LL == 0x00000200 == 0x200 = 512(dec)
这些是小值,可以表示为常规int。
您也可以使用BigInteger。
答案 2 :(得分:1)
这里有很多东西需要学习:
您可能根本不需要在这里使用BigInteger
。在大多数系统上,C ++ long long
类型是带符号的64位整数(请参阅http://en.cppreference.com/w/cpp/language/types)。但Java有一个64位有符号整数类型 - long
。因此,除非您移植专为long long
大于64位(!)的架构设计的C ++代码,否则需要使用Java long
。
前导零在Java中的十六进制文字(即0x...
)中无关紧要。
(但它们对于十进制文字很重要,因为前导零将“十进制”文字转换为八进制文字...这会改变它的值。例如,文字010
代表数字8!)< / p>
如果你确实需要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”小数是相同的数字。
有人问:
实际上更有意思的问题是:编译器将哪个字面值放入java字节码中。
我不认为JLS指定了这个,但它会使用长文字,因为这是JVM规范所要求的。