【发布时间】: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 语言,
{和}被begin和end替换;它是一种不同的语言,如果你尝试按照它自己的方式来处理它,你会获得更好的运气。 -
你是对的,我才刚刚意识到。当我编写自己的 OpenGL 接口时,这是一个很大的痛苦(没有任何好的接口遵循 Ada 命名约定 Like_This),我为 GL_RGBA 之类的东西创建了枚举数据类型,就像它一样在 C 中,却发现我不能按位或 GL_RGBA 与其他 GL_*... 我不得不做一些废话,比如 GL_RGBA'Enum_Rep 或一些 Unchecked_Conversion 废话。常量是唯一的方法。
标签: bit-manipulation ada