【问题标题】:In PHP, what does (int) really do?在 PHP 中, (int) 真正做了什么?
【发布时间】:2016-07-26 17:38:00
【问题描述】:

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

}

***请注意,这个link 似乎没有提供足够的答案。

【问题讨论】:

  • 我真的不明白为什么链接的问题没有提供足够的答案。
  • documentation 告诉您如何将字符串转换为数字。只需忽略有关浮点数的部分,您就会看到它对 int 的工作原理。
  • $a = 05040 相呼应,因为 050 被视为八进制。
  • @Aaron 我知道八进制部分,但是为什么不同基数的不同字符串表示会被 (int) 区别对待?
  • @TheOneandOnlyChemistryBlob 您刚刚回答了自己的问题。不同的碱基需要不同的处理。

标签: php int


【解决方案1】:

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

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

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

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

【讨论】:

  • 有道理...wrt科学记数法,(int)不会首先将'1e6'转换为实际数字并输出100000...它将'1e6'视为数字1,后跟a非数字,只输出 1 就是它的样子
  • 而由 (int) 强制转换的二进制“字符串”'0b111' 不是 111,而是数字 0 后跟一个非数字?
  • 在进行 string->int 转换时会丢弃前导零,这意味着 0b11 -> b11 -> 0,因为 b 不是有效的整数。应该是十六进制,但不是0xb
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-05
  • 2021-09-08
相关资源
最近更新 更多