在PHP中将两个整数转换为long

时间:2013-01-20 22:28:18

标签: php integer type-conversion long-integer

我有两个整数,我需要将它们转换为长整数。我完全迷失了如何做到这一点。我需要转换的两个整数是:

INT 1: 60850985 
INT 2: 59150141

我需要一个将两个整数转换为long的方法。如果你可以张贴一个,那就太好了。

当我说转换为很长时间时,我想知道如何在PHP中用java来完成等效的(长)


让我在这里完全清楚: 我从客户端收到两个int,然后我需要将它们转换为long,然后单个long再次用作单个int。

本质上,我需要采取两个整数并将它们转换为单个int。在java中完成此操作的示例如下:

  long $intA = (long) readInt();
  long $intB = (long) readInt();
  return ($intA << 32) + $intB;

2 个答案:

答案 0 :(得分:3)

PHP将数字存储为整数或浮点数,其中整数的大小取决于平台(但通常为32位,有符号)。如果您需要代表更大的数字,则应使用BC Math函数。

使用BCM添加两个数字就像:

$a = '60850985';
$b = '59150141';
echo bcadd($a, $b);

或乘以:

$a = '60850985';
$b = '59150141';
echo bcmul($a, $b);

编辑:

如果你想得到它,它应该看起来像1-complement中的64位有符号整数(如果有溢出),那么你必须做一些手动转换来将值转换为{{1}范围:

对于非负值,您可以先将其强制转换为-2^63 .. 2^63-1

0 .. 2^64-1

然后,如果它大于$long = bcmod($value, bcpow('2','64')); ,则从中减去2^63-1,然后从2^63中减去此值。

对于负值,首先添加-2^63,直到值为正,然后执行上述步骤。

但是,只有在想要查看溢出时字符串编号的外观时才需要执行上述步骤。通常你不需要这个,可能你甚至不需要使用BCM,因为你的数字很容易适合PHP的带符号的32位整数数据类型(不需要转换,转换是自动的):

2^64

如果您愿意,可以强行转换:

$a = '123'; // $a is a string
echo $a + 1; // will write 124, $a gets converted into int

$a = $a+0;

编辑2:

您仍然可以使用BCM函数进行数学运算:

$a = (int)$a;

然后,如果结果大于$long = bcadd($low, bcmul($high, bcpow('2','32'))) // this essentially means: // $long = $low + $high * 2^32 // which is // $long = $low + $high << 32 ,您可以执行一些额外的BCM计算,如上所述将无符号整数转换为有符号整数。

答案 1 :(得分:2)

我经常使用:

$int1 = 60850985;
$int2 = 59150141;
$result = $int1 + $int2;//120001126

以下是PHP手册的引用:

  

整数的大小取决于平台,尽管是最大值   大约20亿是通常的值(32位签名)。   64位平台的最大值通常约为9E18。 PHP确实如此   不支持无符号整数。可以使用确定整数大小   常量PHP_INT_SIZE,使用常量的最大值   自PHP 4.4.0和PHP 5.0.5以来的PHP_INT_MAX。

如果您想处理大数字,请使用GMP(http://www.php.net/manual/en/book.gmp.php)或BCMath(http://www.php.net/manual/en/book.bc.php)。

要详细说明AgentConundrum所说的内容,不需要在PHP中将整数转换为long。 PHP是一种动态语言,这意味着通常,对于基本类型的操作,不需要进行转换(除非它是出于某些明确的目的 - 即浮点数为整数),因为PHP会为您处理它。