SQL Server Bitwise AND(与JavaScript的区别)

时间:2015-10-20 11:52:15

标签: sql sql-server sql-server-2008-r2 bitwise-operators

我正在尝试在SQL中实现一种特殊的散列算法来解除对某些数据的散列。我快到了,但我最后一步陷入困境。

在SQL中尝试这段代码:

SELECT CAST(2912047312 AS BIGINT) & CAST(2912047312 AS BIGINT)

给了我2912047312

但是在JavaScript中使用以下代码:

console.log(2912047312 & 2912047312);

结果将为-1382919984

我在SQL中做错了什么,请阅读已经完成转换为bigint的必要性,但操作总是返回相同的值。

SQL数据库:SQL Server 2008 10.50.6000

1 个答案:

答案 0 :(得分:2)

<强>的Javascript

执行按位操作时

Javascript is using 32 bit signed integers(因为Tom已将其链接起来)。由于您的值大于32位整数的最大值,因此只会使用整数的下半部分(这是因为溢出)。

您可以通过执行一个简单的测试来测试它:console.log(2912047312 | 0),它会打印-1382919984

2912047312 & 2912047312表达式中的两个操作数将转换为32位整数,因此将对-1382919984 & -1382919984表达式执行实际的按位操作。

有符号整数的范围是−2147483648+2147483647

SQL Server

SQL Server can perform bitwise operation on any integer type operands,包括bigint,因此结果将在更大的数据类型上计算,不会发生溢出。

所以区别在于两个系统在按位运算中使用不同的数据类型,其中一个系统无法处理您提供的值而没有溢出,因此不会更改实际值。

修改

你可以效仿&#39;用一个小技巧溢出:

SELECT (-2147483648 + (CAST(2912047312 AS BIGINT) & CAST(2147483647 AS BIGINT)));

CAST(2912047312 AS BIGINT) & CAST(2147483647 AS BIGINT)部分将丢弃64位整数值的上半部分(高32位为0,低位32位为2147483647值的1,这是使用32位整数的最大值)。

然后它会将结果添加到带符号的32位整数(-2147483648)的最小值。