相当于C ++的BigInteger值long long

时间:2016-09-10 03:47:22

标签: java c++ biginteger

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

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

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

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

这里我注意到BigInteger.valueOf参数中使用的值与long long

的原始0x0000000000000001LL值不同

原始值有16位数字,这个数字有8位数字,最后不包含LL后缀。有人可以解释发生了什么吗?

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

3 个答案:

答案 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)

这里有很多东西需要学习:

  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...)中无关紧要。

    (但它们对于十进制文字很重要,因为前导零将“十进制”文字转换为八进制文字...这会改变它的值。例如,文字010代表数字8!)< / p>

  3. 如果你确实需要Java中的64位整数文字,那么在右端放一个L。假设整数文字为32位。

  4. 在您尝试使用BigInteger(long)的上下文中,无论如何,32位整数文字将加宽到64位。

  5. 所以在你的情况下:

    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规范所要求的。