Types Ada——什么是模块化类型

Types Ada——什么是模块化类型,types,ada,modular,Types,Ada,Modular,我正在努力学习Ada,但是资源是很难的。我一直在读关于这个问题的书,但所有的解释对我来说都很难理解。我经常看到这样的代码 type Stream_Element is mod 2 ** Standard'Storage_Unit; 这有什么用?我找到了一个解释: Ada还允许您定义模块化类型。这些类型是无符号的,并且具有“环绕” 语义学。超出普通类型结尾的递增会导致异常,但递增 超出模块化类型的末尾,将环绕到零。此外,运营商没有,以及, 或者,和xor可用于模块化类型以进行位操作。图11演示了

我正在努力学习Ada,但是资源是很难的。我一直在读关于这个问题的书,但所有的解释对我来说都很难理解。我经常看到这样的代码

type Stream_Element is mod 2 ** Standard'Storage_Unit;
这有什么用?我找到了一个解释:

Ada还允许您定义模块化类型。这些类型是无符号的,并且具有“环绕” 语义学。超出普通类型结尾的递增会导致异常,但递增 超出模块化类型的末尾,将环绕到零。此外,运营商没有,以及, 或者,和xor可用于模块化类型以进行位操作。图11演示了这一点


这个解释有道理,但我不理解代码。
mod 2**X
有什么意义?
mod
的作用是什么?
***
做什么?

***
是求幂运算符。也就是说,
A**B
表示AB

在此上下文中,
mod
,就是您用来告诉它您正在定义模块化类型的语法。在这种情况下,这意味着这是一种整数类型,其值范围为0到2
Standard'Storage\u Unit
-1
Standard'Storage\u Unit
不是由语言定义的,而是由您使用的Ada编译器定义的(该语言允许编译器定义自己的属性);我相信它等于系统存储单元。这是一个常量,用于定义可寻址存储单元中的位数。对于绝大多数处理器来说,该常数为8(因为每个地址寻址一个8位字节),但也有例外


因此,它所做的是定义一个值范围从0到255(在大多数处理器上)的整数类型,即适合一个字节的整数。由于它是“模块化”的,这也意味着类型上的算术运算会自动换行(即,如果您添加130+130,将得到4,并且不会引发
Constraint\u Error
)。模块类型还为它们定义了位运算符
,以及
异或

只是补充一下,模块化类型声明的“2**X”表示法是约定的,不是必需的。本质上,“X”是模块化类型将占用的位数。你可以把它拼成
类型Mod\u类型是Mod 256
@MarcC Correct,
2**X
只是一个表达式,任何表达式都是允许的,只要它是一个可以在编译时计算的表达式。表达式也不必是2的幂;我可以想象有人将一个类型定义为
mod 60
来表示时钟的分针。(按位
/
/
异或
操作仍在定义中,尽管它们可能不是很有用。)