PHP长整型在32位系统中强制转化溢出

CleverCode近期遇到一个PHP项目整形转化问题,mysql有一个字段id是bigint的,里面有长整型,如id = 5147486396。可是php代码因为历史原因却部署在多台机器中,当中A机器32位系统中,B机器64系统中。如今的问题是64系统中页面訪问正常。32位系统中訪问出错了。原因是php整形溢出。

1 A机器演示

1.1 获取A机器系统位数

# getconf LONG_BIT

1.2 整形转化代码

<?

php

$id = 5147486396;
echo ‘$id:‘.$id."\r\n";

$value = (int)$id;
echo ‘(int)$id:‘.$value."\r\n";

$value = intval($id);
echo ‘intval($id):‘.$value."\r\n";

$value = filter_var($id, FILTER_VALIDATE_INT);
echo ‘filter_var($id, FILTER_VALIDATE_INT):‘."\r\n";
var_dump($value);

?>

1.3 执行结果

(int)5147486396的结果是852519100。intval(5147486396)的结果是852519100,filter_var(5147486396, FILTER_VALIDATE_INT)结果是false。

2 B机器演示

2.1 获取B机器系统位数

# getconf LONG_BIT

2.2 整形转化代码

<?php

$id = 5147486396;
echo ‘$id:‘.$id."\r\n";

$value = (int)$id;
echo ‘(int)$id:‘.$value."\r\n";

$value = intval($id);
echo ‘intval($id):‘.$value."\r\n";

$value = filter_var($id, FILTER_VALIDATE_INT);
echo ‘filter_var($id, FILTER_VALIDATE_INT):‘."\r\n";
var_dump($value);

?>

2.3 执行结果

(int)5147486396的结果是5147486396。intval(5147486396)的结果是5147486396,filter_var(5147486396, FILTER_VALIDATE_INT)结果是5147486396。

3 结论

整型数的字长和平台有关。虽然通常最大值是大约二十亿(32 位有符号)。

64 位平台下的最大值一般是大约 9E18。

PHP 不支持无符号整数。Integer 值的字长能够用常量 PHP_INT_SIZE来表示,自 PHP 4.4.0 和 PHP 5.0.5后。最大值能够用常量 PHP_INT_MAX 来表示。

版权声明:

1)原创作品,出自"CleverCode的博客",严禁转载,否则追究版权法律责任。

2)原创地址:http://blog.csdn.net/clevercode/article/details/46423103

3)分类地址(PHP程序猿技术精粹):http://blog.csdn.net/clevercode/article/category/3169943(博客持续添加。关注请收藏)。

4)欢迎大家关注CleverCode博客很多其它的精彩内容:http://blog.csdn.net/CleverCode

5)欢迎大家关注CleverCode的微博:http://weibo.com/CleverCode

时间: 2024-10-15 08:23:54

PHP长整型在32位系统中强制转化溢出的相关文章

4GB的内存条在32位系统中只能显示为3GB左右的原因(转)

原帖地址:http://bbs.51cto.com/viewthread.php?tid=875012&extra=&page=1 1. 4GB的内存条在32位系统中只能显示为3GB左右的原因 第一个原因只会“吃掉”您一小部分的内存 众所周知,电脑中二进制中的换算关系是 1GB=1024MB,实际生产时,硬件厂商厂商的换算单位是1GB=1000MB,当电脑厂商告诉您,您电脑中的内存是1GB的时候,其实您的内存是1000MB,系统识别时,用1000处以1024,也就显示您的内存是0.976G

Visual Studio2015 (VS2015)简体中文版 安装教程(在Win 8.1 32位系统中)

VS2015简体中文版安装 导航 介绍 解决安装先决条件 安装 VS2015 创建桌面快捷方式 启动 VS2015 命令启动VS2015 配置 VS2015 启动完成 MSDN安装 启动MSDN Visual Studio的功能添加和删除 Visual Studio的卸载 补一张安装完成的 介绍    返回顶部 由于安装在不同的操作系统中会遇到不同错误的提示 所以,不会在本篇文章中介绍 Visual Studio2015 在不同操作系统的安装方法. 如果在安装过程中遇到了问题 请在百度中搜索相关

为什么一个指针在32位系统中占4个字节,在64位系统中占8个字节?

一个指针在64位的计算机上,占8个字节:一个指针在32位的计算机上,占4个字节. 原因如下: 我们都知道cpu是无法直接在硬盘上读取数据的,而是通过内存读取.cpu通过地址总线.数据总线.控制总线三条线对内存中的数据进行传输和操作. 具体流程: 1.cpu通过地址总线,找到该条数据: 2.通过控制总线得知该操作是读操作还是写操作: 3.通过数据总线将该数据读取到cpu或者从cpu写到内存中. 所以, 地址总线的宽度决定了CPU的寻址能力: 数据总线的宽度决定了CPU单次数据传输的传送量,也就是数

在32位系统中,int类型的最大值是多少?

首先分析一个问题:int类型一般情况下是否等于signed int类型,目前所知道的编译器一般是这样子的.那再问:为甚答案是2的31次方,减去1,原来符号整型的最大值是31个1,意味着是2^0+2^1+2^1+........+2^30,所以答案就是这个. 延伸出一个问题:如何得知windows的操作系统类型,打开控制面板,就可以看到操作系统类型,显示的是32位操作系统,在这里可以知道一个指针,是4个字节长度.曾经遇到float和double之间的区别,在实际的项目中,从来没有使用到float或

C++获取Windows7 32位系统中所有进程名(类似于任务管理器中的进程)

代码是网上查找资料,然后自己调试,修改之后可以运行. 系统:win7 32位,VS2008 -----------------------------------------------------------------------代码------------------------------------------------------------------------------------ 1 #include <iostream> 2 #include <string&g

windows 32位系统中进程最大可用内存空间为3GB (转)

http://msdn.microsoft.com/zh-cn/library/ms189334.aspx 进程地址空间 所有 32 位应用程序都有 4 GB 的进程地址空间(32 位地址最多可以映射 4 GB 的内存).对于 Microsoft Windows 操作系统,应用程序可以访问 2 GB 的进程地址空间,称为用户模式虚拟地址空间.应用程序拥有的所有线程都共享同一个用户模式虚拟地址空间.其余 2 GB 为操作系统保留(也称为内核模式地址空间).所有操作系统版本(从 Windows 20

Json.NET特殊处理64位长整型数据

很多ASP.NET项目,尤其是使用了Ajax的项目,常常需要返回JSON格式的数据..NET框架从3.5版本开始提供了JSON的序列化和反序列化工具,不过个人感觉不太好用,后来找了第三方的Newtonsoft.Json来用.再后来,在MVC4中,微软已经默认使用Json.NET(Newtonsoft.Json)来处理JSON数据了. JavaScript数值精度是32位,如果整数数度超过32位,就会被当作浮点数处理.换句话说,如果从服务端生成的JSON,某个值是64位整数,传到前端JavaScr

整形_长整型的使用范围和规则

整形_长整型的使用范围(两个数的乘积) 1. I.unsigned long :%lu ; unsigned long long :%llu. II.当结果在输出格式范围之内,则输出正确,否则不正确. III. 当结果在输出格式范围之外,则输出的值与结果模(变量类型的大小的值)相等,且输出的值在变量类型的范围内.这里若结果大于2^64,则上述结论不正确. Code: 1 #include <stdio.h> 2 #include <stdlib.h> 3   4 int main(

【c语言】把一个长整型给一个字符指针

// 把一个长整型给一个字符指针,修改的时候只修改了一个字节,结果会是一个很大的随机数 // 并不能通过这种方式给长整型赋值1 #include <stdio.h> void VarInit(unsigned char* pucArg) { *pucArg = 1; return; } int main() { unsigned long ulGlobal; VarInit((unsigned char*)&ulGlobal); printf("%lu\n", ul