整型强制转换问题


Integer type cast issue

CASE # 1:我有以下代码,它输出正确的编号

<?php 
   $integer = 10000000000;
   $array = array($integer);
   print_r($array[0]); //output = 1000000000
?>

CASE # 2:但当我显式地将相同的数字转换为整数时,它会给出不同的输出

<?php
    $integer = (int)10000000000;
    $array = array($integer);
    print_r($array[0]); //output = 1410065408
?>

CASE # 3:如果我将数字缩小一个0并键入强制转换,那么它将返回正确的数字

<?php
   $integer = (int)1000000000;
   $array = array($integer);
   print_r($array[0]); //output = 1000000000
?>

为什么它没有在CASE # 2中产生正确的输出?

您的平台上最有可能超过int的最大值。

来自官方PHP文档

整数的大小取决于平台,尽管最大值大约20亿是通常的值(即32位有符号)。整数大小可以是使用常数PHP_INT_SIZE确定,最大值使用INT_ MAX。

对于32位平台:

整数可以是-2147483648到2147483647

对于64位平台:

整数可以是9223372036854775808到9223372036864775807

在第二个示例中,您溢出了整数的最大大小。在您的第一个示例中,PHP自动使用较大的数字数据类型(如float)来保存变量,因为它对于int来说太大了。当您在示例2中显式将其强制转换为int时,因为它大于最大大小,它会将其截断为最大大小。在示例3中,该数字短到足以包含在int中。如果您尝试将其强制转换为float,它将产生正确的结果。

<?php
    $integer = (float)10000000000;
    $array = array($integer);
    print_r($array[0]); //output = 10000000000
?>

常量PHP_INT_SIZE将告诉您php安装中支持的最大int大小。

整数的最大值取决于平台,但大约为20亿。案例2是100亿。

如果你想使用浮点类型转换,它有一个更高的限制。。。

参考:http://php.net/manual/en/language.types.integer.php