2016-11-18 5 views
1

私はPL/pgSQL関数callbackfuncを持っています。私がbitwiseの結果でそれを実行し、私のアプリで結果をアンパックすると、私は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

下のサンプルを参照してください。 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)です。

関連する問題