将字符串转换为整型

2022-08-30 22:25:15

我的代码

<?php
var_dump('0xD' * 1 );
var_dump((int)'0xD');
var_dump(intval('0xD'));
var_dump((float)'0xD');

实际结果:

int(13)
int(0)
int(0)
float(0)

为什么前两个条件的结果不一样?你们能为我提供正确的文件吗?

我发现的只是

  • 类型转换:PHP中的类型转换的工作方式与在C中非常相似:所需类型的名称写在要强制转换的变量之前的括号中。在某些类型之间进行转换时,可能并不明显。有关详细信息,请参阅以下部分:...
  • 转换为整数:从字符串:请参阅字符串转换为数字
  • 字符串转换为数字在数值上下文中计算字符串时,将按如下方式确定结果值和类型。

因此,据我所知,文档说直接转换为int和通过放入数字上下文应该是相同的。我的错误是什么?

已添加:尝试在回答之前检查第一个和第二个代码(和输出)。


答案 1

'0xD'是一个字符串。文档清楚地指定了如何将字符串“强制”为整数值(在此处选择示例):(int) '0xD';

在数值上下文中计算字符串时,将按如下方式确定结果值和类型。

如果字符串不包含任何字符“.”、“e”或“E”,并且数值符合整数类型限制(由 PHP_INT_MAX 定义),则该字符串将作为整数进行计算。在所有其他情况下,它将作为浮点数进行评估。

该值由字符串的初始部分给出。如果字符串以有效的数字数据开头,则这将是使用的值。否则,该值将为 0(零)。有效数值数据是可选符号,后跟一个或多个数字(可选包含小数点),后跟可选指数。指数是后跟一个或多个数字的“e”或“E”。

作为数字的弦的初始孔隙是 ,因此它是 。'0xD'0(int) 0

不要将此与编写代码混为一谈。如果你在代码中写它不是一个字符串,它是一个整数的十六进制表示/表示法(Demo):

<?php

$value = eval("return 0xD;");

var_dump($value); # int(13)

这并没有完全回答为什么表达式导致 ,而是解释了到目前为止的其他一切,以及整数值解释的两个规则适用于PHP。'0xD' * 1(int) 13

我假设在 PHP 中转换为整数和整数上下文之间略有不同。如果字符串表示十六进制数,则在整数/浮点数上下文中使用它:

'0xD' * 1

在此表达式中,由于运算符和操作数,字符串将被计算为 number(请参见类型杂耍)。这不是类型转换,因为没有强制转换语言构造。'0xD'*1

看起来,在此表达式的情况下,字符串作为整数的解释是按字面意思(按指定)完成的,但与执行转换时不同。

有人可能会争辩说,当转换适用时,当字面解释适用时,它仍然没有记录在案。但是,使用类型转换可以解决任何此类问题(演示):

<?php

$value = '0xD';

var_dump($value); # string(3) "0xD"
var_dump($value * 1); # int(13)
var_dump((int) $value * 1); # int(0)

答案 2

这是引号,幽灵般的。

<?php
var_dump('0xD' * 1 );
var_dump((int) 0xD);
var_dump(intval(0xD));
var_dump((float) 0xD);

int(13)
int(13)
int(13)
float(13)

我认为PHP不会将字符串中的十六进制值视为可能的int。


推荐