4

21ビットの符号付き整数(3つの7ビット文字で提供)を32ビットの符号付き整数に変換する必要があります。以下の機能を動作させようとしています。outvalを整数として定義すると、「outval:=outvalまたは$FFF00000」ステートメントで範囲チェックが行われます。outvalをロングワードに変更すると、「Val21bit:=outval」で範囲チェックが行われます。範囲チェックは、値が負の場合にのみ発生します。

割り当て周辺の範囲チェックをオフにする以外に、これを機能させるための「適切な」方法はありますか?

function Val21bit(sx:string):integer;       {Input of 3 character string, Vh, Vm, Vl}
var
  outval : longword; // define as Longword to allow or-ing in high bit
{        valueH : 0scccccc
         valueM : 0bbbbbbb
         valueL : 0aaaaaaa
         int    : ssssssss sssscccc ccbbbbbb baaaaaaa  }

begin
     outval := byte(sx[1]);                             //  00000000 00000000 00000000 0scccccc       highest order first
     outval := (outval shl 7) or ($7F and byte(sx[2])); //  00000000 00000000 00sccccc cbbbbbbb
     outval := (outval shl 7) or ($7F and byte(sx[3])); //  00000000 000scccc ccbbbbbb baaaaaaa
     if (outval and $00100000) <> 0 then                //              ^     if sign bit is high, fill in to left
         outval := outval or $FFF00000;                 //  ssssssss sssscccc ccbbbbbb baaaaaaa
     Val21bit  := outval;
end;
4

1 に答える 1

9

はい、明示的に型キャストするだけです。

 Val21bit  := Integer(outval);
于 2012-07-28T23:35:55.363 に答える