【问题标题】:Bitwise Operations in AdaAda 中的位运算
【发布时间】:2022-05-04 23:11:31
【问题描述】:

是否有教程解释了可以使用哪些数据类型的按位运算?我不知道为什么 Lady Ada 认为我不能按位或两个 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。但这是不可原谅的。

【问题讨论】:

  • 您可能还没有发现错误,但您仍然应该阅读本文。 chiark.greenend.org.uk/~sgtatham/bugs.html
  • 如果你在编程语言中看到你不理解的东西,你的第一个假设不应该是设计师是白痴。
  • 我使用的是自然类型,它是整数的子类型,这令人惊讶地导致错误。尽管您写我说设计师是白痴是在说我的话,但我更倾向于认为设计师认为它太复杂而无法将代码转换为 orl %eax, %ecx 之类的东西.我不知道为什么,当然。 C 没有抱怨。
  • 为整数实现按位运算符一点也不难。 C 的理念是让程序员做任何可能有意义的事情。 Ada 的理念更多是关于尽早发现错误。您可以在 Ada 中对整数进行按位运算;你只是不能以你试图做的特定方式去做。 Ada 不仅仅是 C 语言,{}beginend 替换;它是一种不同的语言,如果你尝试按照它自己的方式来处理它,你会获得更好的运气。
  • 你是对的,我才刚刚意识到。当我编写自己的 OpenGL 接口时,这是一个很大的痛苦(没有任何好的接口遵循 Ada 命名约定 Like_This),我为 GL_RGBA 之类的东西创建了枚举数据类型,就像它一样在 C 中,却发现我不能按位或 GL_RGBA 与其他 GL_*... 我不得不做一些废话,比如 GL_RGBA'Enum_Rep 或一些 Unchecked_Conversion 废话。常量是唯一的方法。

标签: bit-manipulation ada


【解决方案1】:

Ada 不提供整数类型的逻辑(按位)运算,它在modular types 上提供它们。这是section in the reference manual

【讨论】:

    【解决方案2】:

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

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

    如果你坚持,你可以定义自己重载的"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 数组,而不是有符号整数。

    【讨论】:

    • 或者使用两个Unsigned_Integers,同时指定它们的地址分别为Left'Address和Right'Address,然后在它们上面做你的OR
    • Here's a test program 似乎可以使用 Keith 的视图转换类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-04-05
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    相关资源
    最近更新 更多