Ada -- 啥是模块化类型
Posted
技术标签:
【中文标题】Ada -- 啥是模块化类型【英文标题】:Ada -- What Is A Modular TypeAda -- 什么是模块化类型 【发布时间】:2014-06-14 06:13:47 【问题描述】:我正在努力学习 Ada,但资源很难。我一直在阅读这个主题,但所有的解释对我来说都很难理解。经常看到这样的代码
type Stream_Element is mod 2 ** Standard'Storage_Unit;
这是做什么的?我找到了解释here:
Ada 还允许您定义模块化类型。这些类型是无符号的并且具有“环绕” 语义。超出普通类型的末尾会导致异常,但递增 超出模块化类型的末尾会回绕为零。此外,运算符 not 和, or, 和 xor 可用于模块化类型进行按位操作。图 11 演示。
这个解释有道理,但我不明白代码。 mod 2 ** X
有什么意义? mod
是干什么用的? **
是做什么的?
【问题讨论】:
【参考方案1】:**
是幂运算符。也就是说,A**B
表示 AB。
mod
,在这种情况下,只是您用来告诉它您正在定义模块化类型的语法。在这种情况下,这意味着这是一个整数类型,其值范围从 0 到 2Standard'Storage_Unit
- 1。Standard'Storage_Unit
不是由语言定义的,而是由 Ada 编译器定义的您正在使用(该语言允许编译器定义自己的属性);我相信它等于System.Storage_Unit
。这是一个常数,它定义了可寻址存储单元中的位数。对于绝大多数处理器,该常数为 8(因为每个地址寻址一个 8 位字节),但也有例外。
所以它的作用是定义一个整数类型,其值范围从 0 到 255(在大多数处理器上),即适合一个字节的整数。由于它是“模块化的”,这也意味着对类型的算术运算会环绕(即,如果添加 130 + 130,您将得到 4,并且不会引发 Constraint_Error
)。模块化类型还为它们定义了位运算符and
、or
和xor
。
【讨论】:
补充一点,模块化类型声明的“2 ** X”符号是约定的,不是必需的。本质上,“X”是模块化类型将占用的位数。可以将其拼写为type Mod_Type is mod 256;
@MarcC 正确,2**X
只是一个表达式,任何表达式都是允许的,只要它是一个可以在编译时计算的表达式。表达式也不必是 2 的幂;我可以设想有人将类型定义为mod 60
来表示时钟的分针。 (按位的and
/or
/xor
操作仍然被定义,尽管它们可能不是很有用。)以上是关于Ada -- 啥是模块化类型的主要内容,如果未能解决你的问题,请参考以下文章