1

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

INT 1: 60850985 
INT 2: 59150141

我需要一种将两个整数转换为长整数的方法。如果你能发一个,那就太好了。

当我说转换为 long 时,我想知道您将如何在 PHP 中从 java 中执行相当于 (long) 的操作


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

本质上,我需要取两个整数并将它们转换为一个整数。在 java 中如何做到这一点的一个例子是:

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

2 回答 2

3

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

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

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

或相乘:

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

编辑:

如果你想得到,它应该如何看起来像 1 补码的 64 位有符号整数(如果有溢出),那么你必须进行一些手动转换以将值转换为-2^63 .. 2^63-1范围内:

例如,对于非负值,您可以首先将其转换为0 .. 2^64-1

$long = bcmod($value, bcpow('2','64'));

然后如果它大于2^63-1然后减去2^63它,然后减去这个值-2^63

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

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

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

如果你愿意,你可以强制转换:

$a = $a+0;

或者

$a = (int)$a;

编辑2:

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

$long = bcadd($low, bcmul($high, bcpow('2','32'))) 
// this essentially means:
// $long = $low + $high * 2^32
// which is
// $long = $low + $high << 32

然后,如果结果大于2^63-1您可以进行一些额外的 BCM 计算,如上所述将无符号整数转换为有符号整数。

于 2013-01-20T22:43:48.100 回答
2

我使用了常规添加:

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

这是 PHP 手册中的一段话:

整数的大小取决于平台,尽管通常值约为 20 亿的最大值(即 32 位有符号)。64 位平台的最大值通常约为 9E18。PHP 不支持无符号整数。自 PHP 4.4.0 和 PHP 5.0.5 起,可以使用常量 PHP_INT_SIZE 确定整数大小,使用常量 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 会为您处理它。

于 2013-01-20T22:40:04.130 回答