跳转到内容

Ada 编程/类型/mod

来自维基教科书,开放的书籍,开放的世界

Ada. Time-tested, safe and secure.
Ada. 经久耐用,安全可靠。


Ada 中的无符号整数的值范围从 0 到某个正数(不一定是 2 的幂减 1)。它们使用mod 关键字定义,因为它们实现了循环算术。

 mod Modulus

其中 'First 为 0,而 'Last 为 Modulus - 1。

循环算术意味着 'Last + 1 = 0 = 'First,以及 'First - 1 = 'Last。除了正常的算术运算符之外,按位, orxor 也为该类型定义(见下文)。

预定义包 Interfaces (RM B.2 [带注释的]) 提供了基于 2 的幂的无符号整数

type Unsigned_n is mod 2**n;

它也为其定义了移位和旋转操作。n 的值取决于编译器和目标架构。

您可以使用range 来对模类型进行子范围化

type Byte is mod 256;
subtype Half_Byte is Byte range 0 .. 127;

但要注意:Half_Byte 的 Modulus 仍然是 256!对这种类型的算术运算至少可以说很有趣。

按位运算

[编辑 | 编辑源代码]

对按位运算符要非常小心, , 异或, not,当模数不是 2 的幂时。一个例子可以说明这个问题。

type Unsigned is mod 2**5;   -- modulus 32
X: Unsigned := 2#10110#;     -- 22
not X        = 2#01001#      -- bit reversal: 9 ( = 31 - 22 ) as expected

其他运算符的工作方式类似。

现在取一个不是 2 的幂的模数。对结果的朴素期望可能会导致超出值范围。例如,再次取not 运算符(有关其他运算符,请参见 RM)

type Unsigned is mod 5;
X: Unsigned := 2#001#;  -- 1, bit reversal: 2#110# = 6 leads out of range

的定义not 因此为

 not X = Unsigned'Last – X  -- here: 4 – 1 = 2#011#

另请参阅

[编辑 | 编辑源代码]

维基教科书

[编辑 | 编辑源代码]

Ada 参考手册

[编辑 | 编辑源代码]


华夏公益教科书