<?php
echo intval(1e10)."<br />";                    // 1410065408
echo intval(420000000000000000000)."<br />";   // 0
echo intval('420000000000000000000')."<br />"; // 2147483647
?>请教兄弟们一个问题,就是第一行结果为什么是1410065408呢?
第三行因为溢出了,所以结果是2147483647,那为什么第二行是0不是2147483647呢?
感谢啊

解决方案 »

  1.   

    手册的这两句话: 
    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. 
      

  2.   

    intval
    获取变量的整数值 (PHP 3, PHP 4, PHP 5) int intval ( mixed var [, int base] )描述
    通过使用特定的进制转换(默认是十进制),返回变量 var 的 integer 数值。 var 可以是任何标量类型。intval() 不能用于 array 或 object。 注意: 
    除非 var 参数是字符串,否则 intval() 的 base 参数不会有效果。 
      

  3.   

    The maximum value depends on the system. 32 bit systems have a maximum signed integer range of
    最大的值依赖系统,32位的系统有符号整型的范围是 -2147483648<值< 2147483647.
    就是说不能超过这个数.
    有符号的应该是-2的31次方(符号位为占用一位)<值<2的31次方可能数字有误. 你要想大的话,请换其他的数据类型
      

  4.   

    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,就是你输出来的值。大体上就是这个意思,不知道我有没有说明白,
      

  5.   

    其实溢出的是第二行:intval(420000000000000000000)
    而不是第三行,因为第三行转 进去的只是一个字符串,PHP在处理时按位去取,也就不存在什么溢出的情况了。
      

  6.   

    第三种还是没听懂,没有学过计算机,对内存的知识不了解。能不能请sdomain再给讲的通俗点?
    非常感谢你!
      

  7.   

    我自己在另一个论坛受到启发后的理解:
    第一行,1e10是个十进制浮点数,换算成二进制是1001010100000010111110010000000000,在32位系统里只能保留低32位,也就是
    01010100000010111110010000000000,换算成十进制就是1410065408。我再换一个浮点数,也是这样算的,说明浮点数被转的时候确实这样做的。
    整数也是这样的:
    第二个,是echo intval(420000000000000000000)." <br />";  // 0 
    420000000000000000000如果取二进制的低32位的话,应该是十进制的2685403136。截取低32位依然溢出,所以根据函数的含义为出错,结果为0如果这个结论不能让人信服的话,可以再来一个echo intval(10000000000)." <br />"; 这个结果和第一行的结果一样是:1410065408,所以原理应该是一样的。
    至于第三行,我觉得sea313081574说的是应该是对的,函数首先判断是正整数,但溢出,所以直接转换成32位系统能表示的最大的正整数 2147483647。感谢所有回帖帮助我的人,谢谢!
    继续期待更底层的解释!