Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript和php之间按位操作结果的差异_Javascript_Php_Bitwise Operators - Fatal编程技术网

javascript和php之间按位操作结果的差异

javascript和php之间按位操作结果的差异,javascript,php,bitwise-operators,Javascript,Php,Bitwise Operators,Javascript代码: console.log( 1 << 5 ); console.log( 1111044149 << 2 ); PHP代码: var_dump( 1 << 5 ); var_dump( 1111044149 << 2 ); 为什么1111044149JavaScript中按位操作的操作数总是被视为int32,而PHP中则不是这样。因此,在1111044149上执行左移位时,JS中会发生这种情况: 01000010001

Javascript代码:

console.log( 1 << 5 );
console.log( 1111044149 << 2 );
PHP代码:

var_dump( 1 << 5 );
var_dump( 1111044149 << 2 );

为什么
1111044149JavaScript中按位操作的操作数总是被视为int32,而PHP中则不是这样。因此,在
1111044149
上执行左移位时,JS中会发生这种情况:

01000010001110010011000000110101 (original, 32-bit)

00001000111001001100000011010100 (left shifted 2 positions, "01" is truncated)
= 149209300

在PHP中,位不会被截断,因为它不被视为32位整数。

感谢您的解释,帮助了我很多,现在我可以创建一个函数来处理自动转换,我忘记了关于32位和64位的细节,因为没有注意

作用

function shift_left_32( $a, $b ) {
    return ( $c = $a << $b ) && $c >= 4294967296 ? $c - 4294967296 : $c;
}
输出

32
149209300

对于JS来说可能是一个很大的整数…实际上,JS的数字可能是64b浮点数。如果php输出是错误的,由于溢出,很容易解释。@Jite确实是,但JS中的逐位操作使用32位整数。@ProgramFOX我不知道这一点。谢谢你提供的信息!:)
function shift_left_32( $a, $b ) {
    return ( $c = $a << $b ) && $c >= 4294967296 ? $c - 4294967296 : $c;
}
var_dump( shift_left_32( 1, 5 ) );
var_dump( shift_left_32( 1111044149, 2 ) );
32
149209300