我知道使用(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;
}
* * *请注意,此链接似乎没有提供足够的答案。
< code>'050'是一个字符串,PHP在进行类型转换时的第一项工作是规范化该字符串:
echo '050' + 1 -> echo '50' + 1 -> echo 50 + 1 -> echo 51 -> 51
<code>050</code>本身是一个八进制数,它已经是一个整数,所以PHP唯一需要做的就是将它转换为一个以10为基数的数字进行输出:
echo 050 + 1 -> echo 40 + 1 -> echo 41 -> 41