Delphi - 从 Integer 到 Byte 类型(负数转换)

Dev*_*rgo 4 delphi byte integer negative-number

我测试了一些代码:

var
   B: Byte;
   I: Integer;
begin
   I := -10;
   B := I;
end;
Run Code Online (Sandbox Code Playgroud)

我期望在数字 10 的变量中看到结果(因为这是 integer 类型的低字节)。但结果是 B => 246。

从逻辑上讲,我明白 246 = 256 - 10,但我不明白为什么会发生这种情况?

Tom*_*erg 8

您对值为 -10 的整数的最低有效 (ls) 字节的值 10 的预期不正确。

负数根据称为2 的补码的系统进行编码,其中 -1 作为四字节整数的值被编码为 $FFFFFFFF,-2 作为 $FFFFFFFE,-3 作为 $FFFFFFFD ... -10 作为 $FFFFFFF6 ...等等。这是目前大多数计算机/软件使用的系统。

还有其他系统。您可能想到的是一种称为“有符号幅度”的系统(请参阅: https: //en.wikipedia.org/wiki/Signed_number_representations),其中最高有效位在设置时表示负值,而实际数字被编码为对于负数和正数都是相同的(定义两个零值 +0 和 -0 带来不便)。


Ste*_*nke 6

该值-10位于. 将其分配给较小宽度的类型只会截断该值 - 这意味着 in 中的值将是。$FFFFFFF6IntegerB$F6246

如果使用范围检查进行编译,则会出现异常,因为-10不适合Byte.

如果你想把负数变成正数,你需要使用Abs函数。