我知道用(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