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;