- 本文地址: https://www.laruence.com/2020/02/28/5261.html
- 转载请注明出处
刚刚吃饭的时候想说今天再写点啥? 突然想起来前几天有人在微博上评论我的一个PHP的面试题:
var_dump(PHP_INT_MIN); var_dump(-9223372036854775808);输出一样么? 如果不一样为什么?
我认为这样的题目作为PHP面试题并不合适。 不过作为一个有趣的知识点,我今天就说说这个小问题吧。
我们知道64位的整数的表值范围是-9223372036854775808 到 9223372036854775807.
在64位系统上PHP内部是使用有符号的64位整形来表示IS_LONG, 分别有俩个常量来表示这俩个值, 分别是PHP_INT_MIN和PHP_INT_MAX.
在64位平台上,PHP_INT_MIN就等于-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类型。 于是接下来....
其实在C语言中如果你写下如下的代码:
int main() { long a = -9223372036854775808; return 0; }
你应该会收到类似如下的警告:
warning: integer constant is so large that it is unsigned
也就是说,你直接写9223372036854775808的话,C编译器会提示你这个数字太大了,应该用unsigned才能表示,并默认给你转成了unsigned long,然后再求负。
当然,也可以强制通过指明UL来避免这个警告从而进行直接赋值,但更多的时候,为了显示的表示此处有坑,大家一般都会这么写(比如在ubuntu的/usr/include/stdint.h):
#define INT64_MIN (-__INT64_C(9223372036854775807)-1)
也就是通过一个表达式来代替直接写一个字面量, 对应的,我们也可以通过在脚本中这么写:
$min = -9223372036854775807 - 1;
来避免这个限制,就能正常表达PHP_INT_MIN啦。 其实在PHP7之前并没有定义PHP_INT_MIN的时候,我们也是这么习惯写的,比如PHP源代码中的一些测试脚本中(ext/date/tests/date_create-relative.phpt):
if (!defined('PHP_INT_MIN')) { define('PHP_INT_MIN', intval(-PHP_INT_MAX - 1)); }
[…] PHP_INT_MIN, […]
嗯嗯
大数据 人工智能 那东东 对数学储备要求比较高
[…] 这里有一个需要注意的是, 0x80DFEC60如果你是自在32位的系统上的话,这个值超过了PHP的最大有符号整数的表示范围,类似我之前的这篇文章介绍的PHP_INT_MIN, PHP会自动转换成浮点数,所以如果是在32位系统上,你不能直接定义0x80DFEC60, 而是需要这么写来定义这个值: […]
面试造火箭,实际拧螺丝
价位不一样,一个造火箭月薪5W,拧螺丝月薪5K
web时代已经过去,大数据,人工智能时代到来,而php连基本语言的语法还未补全,如果不去做一些事,估计两三年php基本没了,希望php能学习python,时代在变化,以前做的事不代表现在还能继续下去,先在有的事,就要转变思维去适应,如果php也能搞人工智能,也能做大数据,那么php不会成为一种过去的记忆,希望能快速抓住这趟车
什么语法没补全,望赐教
0202年了,还有人拘泥于一门语言
涨知识了
你说大家都是招做业务的,面试的时候面的都是些在这些公司内工作中永远用不到的东西,可笑不可笑。
等哪天你当了老板,你去招人的时候
你聘请员工 一个只会写业务 ,一个却懂底层的原理(懂底层 学什么都快)。 你会选哪个??
你不提升自身的竞争力可以悠着, 但别把这个当你是条咸鱼的理由。 甚至在公众场和高谈阔词