阿达 - 什么是模块化类型

an *_*wig 2 types ada modular

我正在努力学习Ada,但是资源很难.我一直在阅读这个主题,但所有的解释都让我难以理解.我经常看到这样的代码

type Stream_Element is mod 2 ** Standard'Storage_Unit;
Run Code Online (Sandbox Code Playgroud)

这是做什么的?我在这里找到了一个解释:

Ada还允许您定义模块类型.这些类型是无符号的,具有"环绕"语义.超出普通类型末尾的增量会导致异常,但是超出模块类型末尾的增量会回绕到零.此外,运算符not,and,和,xor可用于模块化类型以进行按位操作.图11演示了.

这种解释是有道理的,但我不理解代码.请问什么signifigance mod 2 ** X有哪些?这是mod为了什么?这是**做什么的?

ajb*_*ajb 16

**是指数运算符.也就是说,A**B装置A .

mod在这种情况下,只是用来告诉它你定义模块类型的语法.在这种情况下,这意味着这是一个整数类型,其值范围从0到2 Standard'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是mod 256;” (2认同)
  • @MarcC是的,`2 ** X`只是一个表达式,任何表达式都是允许的,只要它是可以在编译时计算的表达式即可。该表达式也不必是2的幂。我可以设想有人将类型定义为“ mod 60”来代表时钟的分针。(尽管它们可能不是很有用,但仍定义了按位“ and” /`or` /`xor`操作。) (2认同)