我需要将 21 位有符号整数(以三个 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;

最佳答案

是的,只需明确类型转换:

 Val21bit  := Integer(outval);

10-06 07:01