在PHP中,(int)真正的作用是什么


In PHP, what does (int) really do?

我知道用(int)铸造会将一个数字向零舍入,但后来我开始用10以外的基数四处寻找,现在我不太确定(int)还能做什么:

$a = 050; // an octal number
echo $a;   // output is ----> 40

然而

$a = '050';
echo (int)$a; // output is ----> 50

所以我认为(int)除了向零取整之外,还剪辑了前导零。但是,如果我用二进制进行与第二个代码块(如上)相同的练习,我就不会得到我所期望的:

$a = '0b010';
echo (int)$a; // output is ----> 0

和十六进制:

$a = '0x050';
echo (int)$a; // output is ----> 0

即使使用十进制科学记数法也会给出一个令人困惑的结果:

$a = 5e6;
$b = '5e6';
echo $a; // output is ----> 5000000
echo (int)$b; // output is ----> 5

使用(int)强制转换为整数的真正含义是什么?除了去除浮点中的小数点和后面的所有字符外,(int)是否逐字符解析强制转换字符串,并返回所有前导、数字和非零字符的串联?像这样:

function intCast($str) {
    $length = strlen($str);
    $returnVal = '';
    for($i = 0; $i < $length; $i++) {
        // Note: ord() values 48 to 57 represent 0 through 9 
        if ($returnVal === '' && ord($str[$i]) == 48) {
            continue; // leading zeroes are OK but don't concatenate
        } else if (ord($str[$i]) > 48 && ord($str[$i]) < 58) {
            $returnVal .= $str[$i];
        } else {
            break;
        }
    }

    return (strlen($returnVal) > 0) ? $returnVal : 0;
}

***请注意,此链接似乎没有提供足够的答案。

'050'是一个字符串,PHP进行类型转换的第一项工作是规范化该字符串:

echo '050' + 1 -> echo '50' + 1 -> echo 50 + 1 -> echo 51 -> 51

050本身就是一个八进制数,它已经是一个整数了,所以PHP唯一要做的就是将它转换为一个以10为基数的数字进行输出:

echo 050 + 1 -> echo 40 + 1 -> echo 41 -> 41