Ada 编程/类型/mod
外观
Ada 中的无符号整数的值范围从 0 到某个正数(不一定是 2 的幂减 1)。它们使用mod
关键字定义,因为它们实现了循环算术。
mod
Modulus
其中 'First 为 0,而 'Last 为 Modulus - 1。
循环算术意味着 'Last + 1 = 0 = 'First,以及 'First - 1 = 'Last。除了正常的算术运算符之外,按位和
, or
和xor
也为该类型定义(见下文)。
预定义包 Interfaces (RM B.2 [带注释的]) 提供了基于 2 的幂的无符号整数
type
Unsigned_nis
mod
2**n;
它也为其定义了移位和旋转操作。n 的值取决于编译器和目标架构。
您可以使用range
来对模类型进行子范围化
type
Byteis
mod
256;subtype
Half_Byteis
Byterange
0 .. 127;
但要注意:Half_Byte 的 Modulus 仍然是 256!对这种类型的算术运算至少可以说很有趣。
对按位运算符要非常小心和
, 或
, 异或
, not
,当模数不是 2 的幂时。一个例子可以说明这个问题。
type
Unsignedis
mod
2**5; -- modulus 32 X: Unsigned := 2#10110#; -- 22not
X = 2#01001# -- bit reversal: 9 ( = 31 - 22 ) as expected
其他运算符的工作方式类似。
现在取一个不是 2 的幂的模数。对结果的朴素期望可能会导致超出值范围。例如,再次取not
运算符(有关其他运算符,请参见 RM)
type
Unsignedis
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#
- 4.4: 表达式 [带注释的]
- 3.5.4: 整数类型 [带注释的]