将字符串转换为 int

Posted

技术标签:

【中文标题】将字符串转换为 int【英文标题】:casting string to int 【发布时间】:2011-10-21 11:53:40 【问题描述】:

我的代码

<?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)

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

我发现的都是

Type Casting:PHP 中的类型转换与 C 中的工作方式非常相似:所需类型的名称写在要转换的变量之前的括号中。在某些类型之间转换时会发生什么可能并不明显。有关详细信息,请参阅以下部分:... Converting to integer:来自字符串: 请参阅字符串转换为数字 String conversion to numbers 在数值上下文中计算字符串时,结果值和类型确定如下。

所以,据我了解,文档说直接转换为 int 并放入数字上下文应该是相同的。我的错误是什么?

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

【问题讨论】:

【参考方案1】:

'0xD' 是一个字符串。 documentation clearly specifies 如何将字符串“转换”为整数值(此处选择 (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)

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

我假设在 PHP 中转换为整数和整数上下文之间存在细微差别。如果表示十六进制数的字符串在整数/浮点上下文中使用:

'0xD' * 1

在这个表达式中,字符串'0xD' 将被评估为数字,因为* 运算符和1 操作数(请参阅Type Juggling)。这不是类型转换,因为没有转换语言结构。

在这个表达式的情况下,字符串解释为整数is done literally(如指定)但与进行转换时不同。

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

<?php

$value = '0xD';

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

【讨论】:

问题是为什么第一个代码返回 13(它也应该使用这个文档) @RiaD:我明白你的意思,我在缺少的部分的答案中添加了更多内容。我可以找到一种叫做 formal structure for integer literals 的东西,类似于这里发生的情况。 好的,但是Type Juggling 指的是this page,因为类型转换也是如此。现在其他程序员和我可以测试你的这种行为,但我认为在文档中缺少这些信息是 php 开发人员的邋遢 @RiaD:事情可能不像你想象的那么容易,所以最好尊重其他人已经为你做的一切,尤其是 PHP 开发人员。您可以帮助改进文档,这可能会帮助您了解更多信息,甚至更好地了解到底发生了什么。给文档一个字:Trust the terrain,不是地图。如果您遇到此类特定问题,最好查看 PHP 的源代码。这确实是一个非常小的方面,文档声明如果你想要一个特定的类型,你应该使用类型转换。 哦,可能我今天太同意了。谢谢解答【参考方案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 不会将字符串中的十六进制值视为可能的整数。

【讨论】:

如您所见,所有 0xD 我的代码都用引号引起来,但第一个字符串转换为 13,第二个字符串转换为 0 第一个实际上是由*字符转换的; PHP 似乎在乘法的上下文中理解它是一个十六进制整数,但是在转换时它只会看到一个没有整数或浮点值的字符串。你怎么看? 好问题!不知道 :P 你是怎么发现这个的? this 做一些测试

以上是关于将字符串转换为 int的主要内容,如果未能解决你的问题,请参考以下文章

怎么将字符串类型转换成int型?初学者简单方法

将字符串转换为 int 和 char

为啥将 C++ 字符串转换为 int?

将字符串转换为int-objective c [重复]

html 将Eval或数据从字符串转换为int或int转换为string.html

如何将 intable 字符串列表转换为 int