PHP_INT_MIN 和 -9223372036854775808

栏目: IT技术 · 发布时间: 6年前

内容简介:首先,我要申明这样的面试题,其实很没意思。 不过作为一个有趣的知识点,我今天就说说这个小问题吧。我们知道64位的整数的表值范围是-9223372036854775808 到 9223372036854775807.在64位系统上PHP内部是使用有符号的64位整形来表示IS_LONG, 分别有俩个常量来表示这俩个值, 分别是PHP_INT_MIN和PHP_INT_MAX.

刚刚吃饭的时候想说今天再写点啥? 突然想起来前几天有人在微博上评论我的一个 PHP 的面试题:

PHP_INT_MIN 和 -9223372036854775808

首先,我要申明这样的面试题,其实很没意思。 不过作为一个有趣的知识点,我今天就说说这个小问题吧。

我们知道64位的整数的表值范围是-9223372036854775808 到 9223372036854775807.

在64位系统上PHP内部是使用有符号的64位整形来表示IS_LONG, 分别有俩个常量来表示这俩个值, 分别是PHP_INT_MIN和PHP_INT_MAX.

在64位平台上,PHP_INT_MIN就等于-9223372036854775808,那题目的意思是啥呢? 我们输出下看看:

var_dump(PHP_INT_MAX);
var_dump(-9223372036854775808);

输出:

int(9223372036854775807)
float(-9.2233720368548E+18)

那是什么造成了这个问题呢?

在PHP编译器处理输入文件输入的时候,对于负数字面量它的处理方式是:

-{LNUM}
   => '-' expr { $$ = zend_ast_create(ZEND_AST_UNARY_MINUS, $2); }
   => UNARY_MINUS: 0 - expr

也就是,首先把负号后面的数字作为一个整形接受进来,然后在把它求负。

于是这就造成了这个问题, 开头我们说了64位的最大正表值是9223372036854775807,那当PHP处理-9223372036854775808的时候, 9223372036854775808超出了64位整形的最大正表值范围,PHP没有办法用一个有符号64位整形存储它,于是只能把它自动转成了DOUBLE类型。 于是接下来....

那PHP_INT_MAX又是怎么回事呢? 其实PHP_INT_MIN的定义不是一个常数,而是一个表达式,类似:

#define PHP_INT_MIN  -9223372036854775807 - 1

于是就不会触发这个限制,就能正常表达PHP_INT_MIN啦。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

微信小程序运营与推广完全自学手册

微信小程序运营与推广完全自学手册

王洪波 / 电子工业出版社 / 2018-6 / 59

本书是运营管理方面的书籍,将小程序的运营推广问题置千小程序的整个运营管理体系中来谈,主要讲述小程序的定位规划、营销吸粉策略、评估优化这三大方面的内容,这三方面的内容之间是三位一体、密切相关的。 书中通过列举丰富且具有代表性的小程序实际案例来向读者提供些可行的运营推广办法。案例涉及美食类、电商类、旅游类、媒体类等小程序,可供多个行业的小程序运营者参考借鉴。 书中所提供的各种小程序营销策略......一起来看看 《微信小程序运营与推广完全自学手册》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试