【问题标题】: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 是干什么用的? ** 是做什么的?

【问题讨论】:

    标签: types ada modular


    【解决方案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)。模块化类型还为它们定义了位运算符andorxor

    【讨论】:

    • 补充一点,模块化类型声明的“2 ** X”符号是约定的,不是必需的。本质上,“X”是模块化类型将占用的位数。可以将其拼写为type Mod_Type is mod 256;
    • @MarcC 正确,2**X 只是一个表达式,任何表达式都是允许的,只要它是一个可以在编译时计算的表达式。表达式也不必是 2 的幂;我可以设想有人将类型定义为mod 60 来表示时钟的分针。 (按位的and/or/xor 操作仍然被定义,尽管它们可能不是很有用。)
    猜你喜欢
    • 2019-05-15
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    相关资源
    最近更新 更多