PL/pgSQL 函数 returns 不正确的按位结果
PL/pgSQL function returns incorrect bitwise result
我有一个 PL/pgSQL 函数 callbackfunc
。如果我 运行 它带有按位结果并将结果解压缩到我的应用程序中,我得到 65/0/65/65
(即 1090535745
)。如果我 return 直接按位运算的结果 (1094795585
) 并解压它,我得到 65/65/65/65
。为什么?
参见下面的示例
CREATE OR REPLACE FUNCTION callbackfunc(value double precision[][][], pos integer[][], VARIADIC userargs text[])
RETURNS double precision
AS $$
DECLARE
var_result double precision;
BEGIN
var_result := (65 << 24 | 65 << 16 | 65 << 8 | 65 << 0);
--var_result := 1094795585;
RETURN var_result;
END;
$$ LANGUAGE 'plpgsql' IMMUTABLE;
这是运算符的优先级。按位或高于 Shift。您的表达式将计算为
var_result := (((((((65 << 24) | 65) << 16) | 65) << 8) | 65) << 0);
给出 1090535745 (= 0x41004141)。对面
var_result := (65 << 24) | (65 << 16) | (65 << 8) | (65 << 0)
给出 1094795585 (= 0x41414141)。
我有一个 PL/pgSQL 函数 callbackfunc
。如果我 运行 它带有按位结果并将结果解压缩到我的应用程序中,我得到 65/0/65/65
(即 1090535745
)。如果我 return 直接按位运算的结果 (1094795585
) 并解压它,我得到 65/65/65/65
。为什么?
参见下面的示例
CREATE OR REPLACE FUNCTION callbackfunc(value double precision[][][], pos integer[][], VARIADIC userargs text[])
RETURNS double precision
AS $$
DECLARE
var_result double precision;
BEGIN
var_result := (65 << 24 | 65 << 16 | 65 << 8 | 65 << 0);
--var_result := 1094795585;
RETURN var_result;
END;
$$ LANGUAGE 'plpgsql' IMMUTABLE;
这是运算符的优先级。按位或高于 Shift。您的表达式将计算为
var_result := (((((((65 << 24) | 65) << 16) | 65) << 8) | 65) << 0);
给出 1090535745 (= 0x41004141)。对面
var_result := (65 << 24) | (65 << 16) | (65 << 8) | (65 << 0)
给出 1094795585 (= 0x41414141)。