gpt4 book ai didi

freepascal - 自由帕斯卡子范围

转载 作者:行者123 更新时间:2023-12-01 01:03:25 26 4
gpt4 key购买 nike

我在 Mac Mavericks 上使用 fpc 2.6.2 和 Lazarus 1.0.12
我创建了一个这样的变量

var
MyVar : 7..200;

如果我给 MyVar 赋值在 7..200 的子范围之外,编译器仍然接受最多 255 的值。如果我分配 256 则 MyVar 中的值变成 0如果我分配 257然后 MyVar变成 1 等等。有没有人知道发生了什么?

最佳答案

您尚未创建子范围。 :-) 您已经声明了一个变量(使用 var )。要正确创建子范围,首先要声明 type :

type
TMyRange = 7..200;

然后将变量声明为 type :
var
MyVar: TMyRange;

尝试分配超出该范围的值会导致编译器错误(例如,在 Delphi 中启用范围检查):
MyVar := 201;

[dcc32 Error] Project1.dpr(22): E1012 Constant expression violates subrange bounds



通常是个好主意打开范围检查 这样编译器就会为你工作。 (打开溢出检查通常也是一个好主意,至少在开发期间是这样。有关原因,请参阅本答案的其余部分。)

就您所看到的行为而言,编译器将创建最小尺寸的序数类型来保存子范围(在本例中为 Byte )。在这种情况下,您没有声明子范围,而是一个简单的变量,编译器将其放入 byte .

因为一个字节可以保存来自 0..255 的值,并且您已经声明了一个字节变量,它可以容纳的最大值是 255。如果您分配 256(并且没有在编译器选项中打开溢出检查),则该值会溢出并环绕到最小值(零) + 1(溢出的位数)。分配 257环绕到最小值 + 2(再次,它溢出的数量)。

关于freepascal - 自由帕斯卡子范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21048845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com