PL / pgSQL函数返回不正确的按位结果

时间:2016-11-18 14:10:03

标签: postgresql plpgsql

我有一个PL / pgSQL函数callbackfunc。如果我使用按位结果运行它并将结果解压缩到我的应用程序中,我得到65/0/65/651090535745)。如果我直接返回按位运算的结果(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;

1 个答案:

答案 0 :(得分:3)

这是运营商的优先权。 Bitwise-Or高于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)。