在PHP中测试整数溢出

时间:2011-09-03 15:59:00

标签: php testing integer overflow

我有一个单元测试,用于测试从字符串到整数的变量转换。到目前为止它很好,除了最后一个。

$_GET['name'] = '42000000000000000000000000000000000000';
$text = $input->get( 'name', Convert::T_INTEGER );
$this->assertEquals( 92233720368547755807, $text );

预期是(由测试本身确认),是大值,当使用intval()从字符串转换为整数时会导致溢出,默认为php可以在我的系统上处理的最大整数值。然而,它仍然失败:

Failed asserting that <integer:92233720368547755807> matches expected <double:9.2233720368548E+19>

当我尝试将预期数字强制为整数时:

$this->assertEquals( intval(92233720368547755807), $text );

我明白了:

Failed asserting that <integer:92233720368547755807> matches expected <integer:0>

在测试之前,测试运行的正确性是什么......

相关代码:

public function get( $name, $type = null )
{
    $value = $_GET['value'];
    if( !is_null( $type ) )
        $value = Convert::to( $value, $type );
    return $value;
}

public static function to( $value, $type )
{
    switch( $type )
    {
        case self::T_INTEGER:
            return intval( $value );
        default:
            return null;
    }
}

所以问题是:我如何让这个测试返回正面?

3 个答案:

答案 0 :(得分:5)

使用PHP_INT_MAX常量:

$this->assertEquals( PHP_INT_MAX, $text );

这将解决您的问题,并使您的测试更具便携性(例如,它也适用于32位系统)。

PHP_INT_MAX的值是PHP构建的较大可表示的int

请参阅http://php.net/manual/en/reserved.constants.php

答案 1 :(得分:2)

您的号码中还有一个5。这样:

92233720368547755807

应该是这样的:

9223372036854775807

答案 2 :(得分:-1)

你的问题是,INT_MAX的数字越高,转换为浮动,这会失去精度。如果将它与String进行比较,它总是返回false。

请使用bcmath函数处理如此大的数字。