对按位运算符进行类型转换

时间:2014-07-01 08:39:21

标签: php bit-shift

有人可以解释为什么我在下面的代码中对两个按位操作有不同的输出?
根据{{​​3}}的php文档,$ value应该转换为整数:

  

两个操作数和<<的结果和>>运算符始终被视为整数。

我的代码:

$value = 4294967295;
echo 'value is float: '  . (($value >> 32 - 1) & 1); //OUTPUT: value is string: 1
$value = '4294967295';
echo 'value is string: ' . (($value >> 32 - 1) & 1); //OUTPUT: value is string: 0

第二次操作的类型转换不起作用,因为不支持无符号整数,并且对字符的ASCII值执行操作? 如果是这样,为什么它与浮点值一起工作?

我的代码可以正常使用浮点值,所以我没有真正的问题,但我想了解发生了什么。我花了一段时间才弄明白,我的代码没有按预期运行。

我在Windows 7 x64上使用php版本5.4.19(用于测试)。

1 个答案:

答案 0 :(得分:0)

这是对正在发生的事情的解释。 PHP 5.3.18,Windows XP,32位。

代码:

$value = 4294967295;        //  This is a 'float'
$vint = (int) $value;      //  this becomes -1 as an integer.

// shows the types and values
var_dump($value, $vint, dechex($vint));
echo 'value is float: '  . (($value >> 32 - 1) & 1); //OUTPUT: value is string: 1

输出:

float 4294967295
int -1
string 'ffffffff' (length=8)
value is float: 1

请注意,'float'将转换为整数-1,即所有位都打开。因此转移时的输出结果。

现在让我们看一下其他结果:

代码:

$value = '4294967295'; // is treated as positive?
var_dump($value, dechex($value));
echo 'value is string: ' . (($value >> 32 - 1) & 1); //OUTPUT: value is string: 0

输出:

string '4294967295' (length=10)
string '7fffffff' (length=8)
value is string: 0

这里有趣的一点是,当转换为整数时,'sign'位为'off'。这解释了移位时的输出。