请教intval()函数

shyhao 2009-08-28 01:08:43
<?php
echo intval(1e10)."<br />"; // 1410065408
echo intval(420000000000000000000)."<br />"; // 0
echo intval('420000000000000000000')."<br />"; // 2147483647
?>



请教兄弟们一个问题,就是第一行结果为什么是1410065408呢?
第三行因为溢出了,所以结果是2147483647,那为什么第二行是0不是2147483647呢?
感谢啊
...全文
1110 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
shyhao 2009-08-29
  • 打赏
  • 举报
回复
我自己在另一个论坛受到启发后的理解:
第一行,1e10是个十进制浮点数,换算成二进制是1001010100000010111110010000000000,在32位系统里只能保留低32位,也就是
01010100000010111110010000000000,换算成十进制就是1410065408。

我再换一个浮点数,也是这样算的,说明浮点数被转的时候确实这样做的。


整数也是这样的:
第二个,是echo intval(420000000000000000000)." <br />"; // 0
420000000000000000000如果取二进制的低32位的话,应该是十进制的2685403136。截取低32位依然溢出,所以根据函数的含义为出错,结果为0

如果这个结论不能让人信服的话,可以再来一个echo intval(10000000000)." <br />"; 这个结果和第一行的结果一样是:1410065408,所以原理应该是一样的。


至于第三行,我觉得sea313081574说的是应该是对的,函数首先判断是正整数,但溢出,所以直接转换成32位系统能表示的最大的正整数 2147483647。



感谢所有回帖帮助我的人,谢谢!


继续期待更底层的解释!
shyhao 2009-08-29
  • 打赏
  • 举报
回复
第三种还是没听懂,没有学过计算机,对内存的知识不了解。能不能请sdomain再给讲的通俗点?
非常感谢你!
sdomain 2009-08-28
  • 打赏
  • 举报
回复
其实溢出的是第二行:intval(420000000000000000000)
而不是第三行,因为第三行转 进去的只是一个字符串,PHP在处理时按位去取,也就不存在什么溢出的情况了。
sdomain 2009-08-28
  • 打赏
  • 举报
回复
1.intval(1e10)
其实就是intval(10000000000);即10的10次方
对于这种类型的转换,由于他已经超过的int的范围了,在进行intval转 换时,
他其实只取出来整型的那部分,然后选截取整型(32位)的大小,再转成int型,
这种情况下,假设1e10转 成二进制为:1001010100000010111110010000000000
那他截取32位后就变成01010100000010111110010000000000 然后去掉第一位就是:
1010100000010111110010000000000 就是他所表示的正的整型数(第一位为0)
像如intval(1e12)的值转成二进制的是:1110100011010100101001010001000000000000
取32位是:11010100101001010001000000000000
那转换成整型就是1010100101001010001000000000000->727379968
最高位是1所以结果就是 -727379968


2.intval(420000000000000000301)
这种情况下,则于参数内实际是保存了double型的(php内为float)这种转换是溢出了,直接返回0,在linux下面有时返回-2147483648-不难理解!
3.echo intval('420000000000000300000')
这种情况其实根第一种有点相似,里面的参数其实在内存内是以字符格式保存的(第一种是以float型式存储的),在转换成整型时,由于字符串地址与整型的地址存储方式不一样,对于转换整型的intval函数去按地址读出来后,其实读出来的只是数值型的那部分,高出的都去掉了,也就是达到了int的最大的值,但因为是直接读取地址的,把字符串的地址当整型来读,读进来的就是整型,所以也不会出现溢出的情况,所以得到的其实就是转换成int的最大值。相当于最高位其实是0后面都是1,所以就是2的31次方式减1,就是你输出来的值。

大体上就是这个意思,不知道我有没有说明白,
jlzan1314 2009-08-28
  • 打赏
  • 举报
回复
The maximum value depends on the system. 32 bit systems have a maximum signed integer range of
最大的值依赖系统,32位的系统有符号整型的范围是 -2147483648<值< 2147483647.
就是说不能超过这个数.
有符号的应该是-2的31次方(符号位为占用一位)<值<2的31次方

可能数字有误. 你要想大的话,请换其他的数据类型
shyhao 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 yhl27 的回复:]
intval
获取变量的整数值 (PHP 3, PHP 4, PHP 5)

int intval ( mixed var [, int base] )

描述
通过使用特定的进制转换(默认是十进制),返回变量 var 的 integer 数值。

var 可以是任何标量类型。intval() 不能用于 array 或 object。

注意:
除非 var 参数是字符串,否则 intval() 的 base 参数不会有效果。


[/Quote]



兄弟,你是砸场子的吧?贴这个不是浪费资源嘛
YHL27 2009-08-28
  • 打赏
  • 举报
回复
intval
获取变量的整数值 (PHP 3, PHP 4, PHP 5)

int intval ( mixed var [, int base] )

描述
通过使用特定的进制转换(默认是十进制),返回变量 var 的 integer 数值。

var 可以是任何标量类型。intval() 不能用于 array 或 object。

注意:
除非 var 参数是字符串,否则 intval() 的 base 参数不会有效果。

shyhao 2009-08-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 jlzan1314 的回复:]
整形位数达不到你的那个值.
[/Quote]
敢问老兄啥意思啊?能不能说清楚点
jlzan1314 2009-08-28
  • 打赏
  • 举报
回复
整形位数达不到你的那个值.
shyhao 2009-08-28
  • 打赏
  • 举报
回复
这几句话我看了很多遍了,没发现有我问题的答案。恕我愚钝,能说清楚点吗?
Bevin_chen 2009-08-28
  • 打赏
  • 举报
回复
手册的这两句话:
The integer value of var on success, or 0 on failure. Empty arrays and objects return 0, non-empty arrays and objects return 1.

The maximum value depends on the system. 32 bit systems have a maximum signed integer range of -2147483648 to 2147483647. So for example on such a system, intval('1000000000000') will return 2147483647. The maximum signed integer value for 64 bit systems is 9223372036854775807.

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧