2016-11-18 39 views
1

我有一個PL/pgSQL函數callbackfunc。如果我用按位結果運行它並在我的應用程序中解壓結果,我得到了65/0/65/65(即1090535745)。如果我直接返回按位運算的結果(1094795585)並將其解壓縮,我得到了65/65/65/65。爲什麼?下面PL/pgSQL函數返回不正確的位結果

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; 

回答

3

看樣這是運營商的優先級。按位或高於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)。