埃菲尔的整数大小是多少?它如何处理溢出?

时间:2016-11-02 11:18:00

标签: integer integer-overflow eiffel

Eiffel中,INTEGER类型的大小是多少?

我无法找到它,除了here,声称大小为32位。

在这种情况下,Eiffel手柄如何溢出?是不是像C中的未定义行为?或者是否有防止溢出的机制?

如果有任何资源我可以找到它,那么请指导我。

1 个答案:

答案 0 :(得分:1)

根据ECMA standard INTEGER被定义为整数类的一个大小变体的别名,建议大小为64位。但是,由于存在大量现有代码,因此当前实现仍然使用INTEGER的32位整数。可以通过编译器选项设置大小(例如,EiffelStudio使用Eiffel配置文件(ECF)将INTEGER映射到INTEGER_32,这在核心库{{1}中完成})。原则上,库或应用程序可以使用类型映射为Base类型指定不同的大小。该机制不是Eiffel语言规范的一部分,因此当需要特定大小时,通常会直接使用大小的变体。

Eiffel标准没有定义基本类型的精确行为,即从语言角度来看它们被视为任何其他类型。我知道,所有实现都不检查整数溢出或下溢,并以模块的形式静默包装结果。

有几种基于库的解决方案提供任意精度整数运算:

  • factorial(1994年,使用TowerEiffel 1.3.1测试) - INTEGER代表大整数值
  • big_numbers(1998年,使用SmallEiffel -0.80测试) - FACTORIAL带有一组其他数字类
  • eapml(Eiffel Arbitrary Precision数学图书馆)(当代,包含在 contrib 下的标准EiffelStudio发行版中) - BIG_INTEGER - 任意精度整数
  • dcm(当代,包含在 contrib 下的标准EiffelStudio发行版)和gobo(当代,Gobo框架的一部分,包含在 contrib 下的标准EiffelStudio发行版中) - {{分别为1}}和INTEGER_X - General Decimal Arithmetic Specification
  • 后面的十进制数字