Delphi 如何";“建立”;字节中的负32位整数,无范围检查错误?

Delphi 如何";“建立”;字节中的负32位整数,无范围检查错误?,delphi,delphi-7,type-conversion,Delphi,Delphi 7,Type Conversion,我需要将21位有符号整数(以三个7位字符提供)转换为32位有符号整数。我正在努力使下面的函数工作。如果我将outval定义为整数,则会在“outval:=outval或$FFF00000”语句上进行范围检查。如果我将outval更改为longword,则会在“Val21bit:=outval”上进行范围检查。仅当值为负值时,才会进行范围检查 除了在作业中关闭范围检查之外,还有什么“适当”的方法可以让这项工作正常进行吗 function Val21bit(sx:string):integer;

我需要将21位有符号整数(以三个7位字符提供)转换为32位有符号整数。我正在努力使下面的函数工作。如果我将outval定义为整数,则会在“outval:=outval或$FFF00000”语句上进行范围检查。如果我将outval更改为longword,则会在“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(sx:string):整数;{输入3个字符串,Vh,Vm,Vl}
变量
outval:longword;//定义为长字,以允许在高位使用或隐藏
{valueH:0scccccccc
价值:0bbb
值:0aaaaaaaaa
int:ssssssccccccccbbbbbaaaaaa}
开始
outval:=字节(sx[1]);//00000000 00000000 00000000 0scccccc最高订单优先
outval:=(outval shl 7)或($7F和字节(sx[2]);//00000000 00000000 SCCCC CBBBBB
outval:=(outval shl 7)或($7F和字节(sx[3]);//000000000SCCCCCBBBBBAAAAAA
如果(outval和$00100000)为0,则//^如果符号位为高,请在左侧填写
outval:=outval或$FFF00000;//SSSSSSSCCCCCBBBBBAAAAAAA
Val21bit:=outval;
结束;

是的,只需显式键入:

 Val21bit  := Integer(outval);

是的,这很好用。因为我没有得到类型不匹配的错误,所以我不认为typecast是一个解决方案。我在Delphi 3上尝试了这段代码,它在没有任何更改的情况下完美地工作(使用outval作为“整数”)。Delphi7是否明确存在这样一个问题,即当需要类型转换没有任何逻辑意义时,它需要类型转换?