4

是否有教程解释可以使用哪些数据类型的按位运算?我不知道为什么艾达夫人认为我不能按位或两个 Standard.Integer...

$ gnatmake test.adb
gcc -c test.adb
test.adb:50:77: there is no applicable operator "Or" for type "Standard.Integer"
gnatmake: "test.adb" compilation error

真的吗?我原谅编译器无法与/或枚举数据类型。我原谅编译器无法对字符类型执行按位运算。我原谅编译器无法以我认为显而易见的方式从 Unsigned_8 转换为 Character。但这是不可原谅的。

4

2 回答 2

22

似乎没有人想出来回答这个该死的问题:

Ada 不提供整数类型的逻辑(按位)操作,它提供模块化类型的操作。这是参考手册中的部分

于 2013-08-21T21:04:35.690 回答
13

、和运算符是为"and"、模块化类型和 的一维数组定义的。"or""xor"BooleanBoolean

该语言可以为有符号整数类型定义它们,但是考虑到有符号整数可以表示的各种方式,这会造成混淆。(大多数实现使用二进制补码,但还有其他可能性。)

如果您坚持,您可以定义自己的重载"or"运算符,例如:

function "or"(Left, Right: Integer) return Integer is
    type Unsigned_Integer is mod 2**Integer'Size;
begin
    return Integer(Unsigned_Integer(Left) or Unsigned_Integer(Right));
end "or";

(我已经验证了它可以编译,但我没有测试它,我希望它会因负值而失败。)

但是,如果您需要执行按位运算,最好使用模块化类型或数组Boolean而不是有符号整数。

于 2013-08-21T19:18:16.830 回答