【问题标题】:Converting two integers into a long in PHP在 PHP 中将两个整数转换为长整数
【发布时间】:2013-01-04 00:00:12
【问题描述】:

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

INT 1: 60850985 
INT 2: 59150141

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

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


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

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

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

【问题讨论】:

  • 我收到的是 120001126 而不是 60000564。你在尝试什么?你能发布你所做的吗?
  • 哦。我误读了长篇。我对 long 应该是什么完全错了。您使用什么方法将整数转换为长整数?
  • 他把它们加在一起。请定义“将它们转换为长”的含义。
  • 我需要在 Java 中转换为 long 的等价物。不清楚是我的坏事。
  • @MitchellM 你在这里有一个根本的误解。 PHP 是一种松散类型的语言,只有几个原语——整数、浮点数、布尔值、字符串、数组。 “整数”可以保存“长”的值,因为它们与 Java 中的不同。

标签: php integer type-conversion long-integer


【解决方案1】:

我用的是正则加法:

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

以下是 PHP 手册的引述:

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

如果您想处理大量数据,请使用 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 会为您处理它。

【讨论】:

    【解决方案2】:

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

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

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

    或乘法:

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

    编辑:

    如果你想得到,它应该是一个 64 位有符号整数的 1 补码(如果有溢出),那么你必须进行一些手动转换以将值转换为 -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 计算,如上所述将无符号整数转换为有符号整数。

    【讨论】:

    • 如果你知道你必须写的计算(a+(b
    猜你喜欢
    • 2011-10-05
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2016-12-23
    • 1970-01-01
    • 2022-06-24
    • 1970-01-01
    相关资源
    最近更新 更多