Delphi - 从整型转换为字节类型(负数转换)

4

我测试了一些代码:

var
   B: Byte;
   I: Integer;
begin
   I := -10;
   B := I;
end;

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

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


声明一个 Shortint 变量和一个 Integer 变量,Integer 是 32 位的,不适合放在字节里。 - whosrdaddy
2个回答

8
你对值为-10的整数最低有效字节(ls byte)期望为10是不正确的。
负数按照一种称为“二进制补码”的系统进行编码,其中四字节整数的-1值编码为$FFFFFFFF,-2编码为$FFFFFFFE,-3编码为$FFFFFFFD......-10编码为$FFFFFFF6,以此类推。这是当前大多数计算机/软件使用的系统。
还有其他系统。你可能想到的是一种称为“符号加减法”的系统(参见:https://en.wikipedia.org/wiki/Signed_number_representations),其中当设置最高位时,表示负数,而实际数字编码相同,正数和负数都使用相同的编码方式(需要定义两个零值,+0和-0)。

谢谢您提供如此详细的答案,现在一切都非常清楚。 - DevSergo

6

数值-10Integer类型中表示为$FFFFFFF6。将其分配给宽度较小的类型将仅截断该值--这意味着B中的值将为$F6,即246

如果使用范围检查编译,则会收到异常,因为-10无法适应Byte类型。

如果要将负数转为正数,需要使用Abs函数。


非常希望看到关于二进制补码的参考资料。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接