【问题标题】:is my php interpreter going crazy, or am i the one who is...?我的 php 解释器发疯了,还是我是……?
【发布时间】:2012-01-29 14:02:57
【问题描述】:

我继续遇到非常奇怪的行为编码 php。这是一个例子:

<?php 
date_default_timezone_set("Europe/Berlin");
$interval1 = (int) 336000;
$interval2 = (int) 1459200;
$interval3 = (int) 17403000;
$interval4 = (int) 43205760;
$interval5 = (int) 84299520;
$week =  (int) 604800;
?>

当我运行此代码时,我收到“第 8 行出现意外的 T_INT_CAST 错误” 怎么回事?!!前 5 次施法效果很好。当我什么都不做时,前 5 个表达式产生一个整数,最后一个是字符串。我在比较值时注意到了这一点,显然得到了错误的结果。

这是十六进制编辑器的输出(根据评论中的要求):

00000000: 3C 3F 70 68 70 20 0A 64  61 74 65 5F 64 65 66 61 
00000010: 75 6C 74 5F 74 69 6D 65  7A 6F 6E 65 5F 73 65 74 
00000020: 28 22 45 75 72 6F 70 65  2F 42 65 72 6C 69 6E 22 
00000030: 29 3B 0A 24 69 6E 74 65  72 76 61 6C 31 20 3D 20 
00000040: 28 69 6E 74 29 20 33 33  36 30 30 30 3B 20 2F 2F 
00000050: 74 65 73 74 20 69 6E 74  65 72 76 61 6C 20 66 72 
00000060: 6F 6D 20 68 74 74 70 3A  2F 2F 65 63 6B 71 75 61 
00000070: 72 74 65 72 73 2E 63 6F  6D 2F 6D 6F 65 74 65 72 
00000080: 77 6F 6C 66 2F 64 69 61  67 72 61 6D 6D 31 2E 68 
00000090: 74 6D 6C 0A 24 69 6E 74  65 72 76 61 6C 32 20 3D 
000000A0: 20 28 69 6E 74 29 20 31  34 35 39 32 30 30 3B 0A 
000000B0: 24 69 6E 74 65 72 76 61  6C 33 20 3D 20 28 69 6E 
000000C0: 74 29 20 31 37 34 30 33  30 30 30 3B 0A 24 69 6E 
000000D0: 74 65 72 76 61 6C 34 20  3D 20 28 69 6E 74 29 20 
000000E0: 34 33 32 30 35 37 36 30  3B 0A 24 69 6E 74 65 72 
000000F0: 76 61 6C 35 20 3D 20 28  69 6E 74 29 38 34 32 39 
00000100: 39 35 32 30 3B 0A 24 77  65 65 6B 20 3D 20 A0 69 
00000110: 6E 74 76 61 6C 28 36 30  34 38 30 30 29 3B

【问题讨论】:

  • 我运行这个没有错误。 PHP 5.3.6
  • 你说得对,这很奇怪:没有八行代码。
  • 如果您包含&lt;?php,则有
  • 用合适的编辑器打开它,那里可能有一些疯狂的字符..
  • 如果您在 intval 上遇到致命错误,那肯定是您的 php 解释器有严重问题。你能在十六进制编辑器中打开这个文件,然后贴一张涉及最后一次演员的部分的截图吗?

标签: php casting


【解决方案1】:

正如您在 php 代码中的十六进制编辑器中看到的那样,在 intval / (int) 转换之前有一个不间断的空格:(第二个空格)

00000100: 39 35 32 30 3B 0A 24 77 65 65 6B 20 3D 20A069

摆脱它,您的代码应该可以工作。

【讨论】:

  • 非常感谢,这真是一些疯狂的东西 :) 我自己永远也想不通!
【解决方案2】:

你应该考虑

PHP_INT_SIZE

整数的大小取决于平台,尽管通常值约为 20 亿的最大值(即 32 位有符号)。 64 位平台的最大值通常约为 9E18。 PHP 不支持无符号整数。自 PHP 4.4.0 和 PHP 5.0.5 起,可以使用常量 PHP_INT_SIZE 确定整数大小,使用常量 PHP_INT_MAX 确定最大值。

当尝试将浮点数转换为整数时,如果浮点数超出整数的边界(在 32 位平台上通常为 +/- 2.15e+9 = 2^31 和 +/- 9.22e+18 = 2^63 在 64 位平台上),结果未定义,因为浮点数没有足够的精度来给出精确的整数结果。发生这种情况时不会发出警告,甚至不会发出通知!

尝试更改 PHP_INT_SIZE 常量并告诉我们发生了什么变化

【讨论】:

  • 这有什么关系?? (这是一个反问...)
  • 感谢您的回答!....9223372036854775807 == 我在系统上得到的 PHP_INT_MAX 常量。除此之外,如果 int 大小是问题所在,为什么我没有得到最高值的错误?
  • 我想到了 PHP_INT_SIZE,因为 php 在使用更大整数的情况下的行为,正如我所说,未定义(甚至未定义)
猜你喜欢
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 2011-10-31
  • 2023-04-08
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多