php 5.4下 1 << -2 的结果怎么是 4611686018427387904?

Almzg_0 2011-03-22 03:38:01
我在本地测试(php版本是5.3),得到得结果是:1073741824,这是正确结果。

代码如下:
<?
$temp = 1;
$right = ($temp << -2);
echo $right;
?>

大家知道是咋回事么?
...全文
1259 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Almzg_0 2011-03-24
  • 打赏
  • 举报
回复
处理如下了:
判断 是64位的,就右移32位
Almzg_0 2011-03-23
  • 打赏
  • 举报
回复
非常感谢你们提供的原因。
具体咋解决啊 ?嘻嘻
feng_lqwe 2011-03-23
  • 打赏
  • 举报
回复
1 << 2 <=>向左移2位,右边补0,100 即4;
1<< -2 <=> 1>>2 右移2位 在最高位前补0,由(111111111111111)1变成001111111111111
记得以前老师是这么教的。。。

feng_lqwe 2011-03-23
  • 打赏
  • 举报
回复
就是二进制移位嘛
lazyboy_wu 2011-03-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 helloyou0 的回复:]

简单, 那是64位机器,你的是32位的
[/Quote]

+1
helloyou0 2011-03-22
  • 打赏
  • 举报
回复
简单, 那是64位机器,你的是32位的
Almzg_0 2011-03-22
  • 打赏
  • 举报
回复
说下我应用得场景吧。
我是从网上找到一个des算法,其中有如下代码: $right ^= ($temp << -16);
发现左移正数没问题,左移负数有问题,按照 kyzy_yy_pm 和 freeman 的建议,能否把代码替换下?
Almzg_0 2011-03-22
  • 打赏
  • 举报
回复
有符号别算
======
怎么说?


1 << -2
其实向右移动了两位
1111111111111111(16)
11111111111111111111111111111111(32)
注意有无符号
==========
php新手,能提供更多信息么?
随行的太阳 2011-03-22
  • 打赏
  • 举报
回复
有符号别算
kyzy_yy_pm 2011-03-22
  • 打赏
  • 举报
回复
1 << -2
其实向右移动了两位
1111111111111111(16)
11111111111111111111111111111111(32)
注意有无符号

21,886

社区成员

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

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