SQL 服务器按位与(与 JavaScript 的区别)
SQL Server Bitwise AND (differences with JavaScript)
我正在尝试在 SQL 中实施一种特殊的哈希算法来对我们的一些数据进行去哈希处理。我快到了,但我卡在了最后一步。
尝试 SQL 中的这段代码:
SELECT CAST(2912047312 AS BIGINT) & CAST(2912047312 AS BIGINT)
给我 2912047312
但是在 JavaScript 中使用以下代码:
console.log(2912047312 & 2912047312);
结果将是-1382919984
我是不是在 SQL 中做错了什么,阅读关于转换为 bigint 的必要性已经完成,但操作总是 returns 相同的值。
SQL 数据库:SQL Server 2008 10.50.6000
Javascript
Javascript is using 32 bit signed integers 同时执行按位运算(正如 Tom 已经链接的那样)。由于您的值大于 32 位整数的最大值,因此只会使用整数的较低部分(这是因为溢出)。
你可以通过执行一个简单的测试来测试它:console.log(2912047312 | 0)
它将打印你 -1382919984
.
2912047312 & 2912047312
表达式中的两个操作数将被转换为 32 位整数,因此实际的按位运算将在 -1382919984 & -1382919984
表达式上执行。
有符号整数的范围是−2147483648
到+2147483647
。
SQL 服务器
SQL Server can perform bitwise operation on any integer type operands,包括bigint,所以结果会在更大的数据类型上计算,不会发生溢出。
所以区别是因为两个系统在按位运算中使用不同的数据类型,其中一个系统无法在不溢出的情况下处理您提供的值,因此不会更改实际值。
编辑
你可以 'emulate' 用一个小技巧来溢出:
SELECT (-2147483648 + (CAST(2912047312 AS BIGINT) & CAST(2147483647 AS BIGINT)));
CAST(2912047312 AS BIGINT) & CAST(2147483647 AS BIGINT)
部分会去掉64位整数值的高位部分(高32位为0,低32位为1,对于2147483647这个值是使用32位整数的最大值).
然后它将结果与带符号的 32 位整数 (-2147483648) 的最小值相加。
我正在尝试在 SQL 中实施一种特殊的哈希算法来对我们的一些数据进行去哈希处理。我快到了,但我卡在了最后一步。
尝试 SQL 中的这段代码:
SELECT CAST(2912047312 AS BIGINT) & CAST(2912047312 AS BIGINT)
给我 2912047312
但是在 JavaScript 中使用以下代码:
console.log(2912047312 & 2912047312);
结果将是-1382919984
我是不是在 SQL 中做错了什么,阅读关于转换为 bigint 的必要性已经完成,但操作总是 returns 相同的值。
SQL 数据库:SQL Server 2008 10.50.6000
Javascript
Javascript is using 32 bit signed integers 同时执行按位运算(正如 Tom 已经链接的那样)。由于您的值大于 32 位整数的最大值,因此只会使用整数的较低部分(这是因为溢出)。
你可以通过执行一个简单的测试来测试它:console.log(2912047312 | 0)
它将打印你 -1382919984
.
2912047312 & 2912047312
表达式中的两个操作数将被转换为 32 位整数,因此实际的按位运算将在 -1382919984 & -1382919984
表达式上执行。
有符号整数的范围是−2147483648
到+2147483647
。
SQL 服务器
SQL Server can perform bitwise operation on any integer type operands,包括bigint,所以结果会在更大的数据类型上计算,不会发生溢出。
所以区别是因为两个系统在按位运算中使用不同的数据类型,其中一个系统无法在不溢出的情况下处理您提供的值,因此不会更改实际值。
编辑
你可以 'emulate' 用一个小技巧来溢出:
SELECT (-2147483648 + (CAST(2912047312 AS BIGINT) & CAST(2147483647 AS BIGINT)));
CAST(2912047312 AS BIGINT) & CAST(2147483647 AS BIGINT)
部分会去掉64位整数值的高位部分(高32位为0,低32位为1,对于2147483647这个值是使用32位整数的最大值).
然后它将结果与带符号的 32 位整数 (-2147483648) 的最小值相加。