我如何在 Ada 中打印出 System.Min_Int?

How do I print out System.Min_Int in Ada?

使用 GNAT,我正在尝试打印出 System.Min_Int

Ada.Integer_Text_IO.Put(System.Min_Int);

产生这个:

"warning: value not in range of type "Ada.Text_Io.Integer_Io.Num" "

我也试过了

Ada.Integer_Text_IO.Put_Line(Integer'Image(System.Min_Int));

产生:

value not in range of type "Standard.Integer"

如何打印 System.Min_Int

令人困惑的是,System.Min_Int 在至少最近的一个 Gnat 中似乎是 Long_Integer(尽管正如 Simon 指出的那样,它实际上是 Long_Long_Integer,但在某些编译器上却不是所有,这些具有相同的范围)。

因此,以下工作(在 gcc4.9.3 中):
Put_Line(Long_Integer'Image(System.Min_Int));
报告 -9223372036854775808.

Ada.Long_Integer_Text_IO.Put(System.Min_Int);

也是

另一方面,您可能一直在尝试寻找Integer类型的最小值,即...Integer'First,果然,

Put_Line(Integer'Image(Integer'First));
报告 -2147483648

差异的基本原理是 Ada 可以支持不可数的整数类型,但为了方便起见提供了一些默认类型,如 Integer

System.Min_Int 和朋友反映了您特定系统的限制:尝试声明更大的整数类型是合法的,但不会在您的系统上编译(即,直到您升级编译器)。

在正常使用中,您将使用 Integer 或更好的整数类型,您声明的范围适合您的问题。而且每种类型的限制显然不能内置到语言甚至 System 包中。相反,您使用预定义的属性,例如 'First'Last 来查询相关的整数类型。

因此您可以通过以下方式探索您机器的极限:

with Ada.Text_IO; use Ada.Text_IO;
with System;

procedure pmin is
   type Big_Integer is range System.Min_Int ..System.Max_Int;
   package Big_Integer_IO is new Integer_IO(Num => Big_Integer);
begin
   Big_Integer_IO.Put(System.Min_Int);
   Put(" to ");
   Big_Integer_IO.Put(System.Max_Int);
   New_Line;
end pmin;

在这里(gcc4.9.3)我得到结果:

-9223372036854775808 to 9223372036854775807

如果 System.Min_Int 不再在 Gnat/gcc 6.1 中的 Long_Integer 范围内,我很想知道这对您的系统有何影响。请在评论中添加您的测试结果。

System.Min_IntSystem.Max_Int 命名数字 。从逻辑上讲,它们的类型是 universal_integer。它们可以隐式转换为整数类型(就像42这样的整数常量),当然类型需要足够大才能容纳它。

没有预定义的整数类型可以保证能够保存 System.Min_IntSystem.Max_Int 的值。甚至不需要实现来定义 Long_Integer,并且 Integer 只需要至少 16 位。

幸运的是,定义您自己的具有必要范围的整数类型很容易。

with Ada.Text_IO;
with System;
procedure Min_Max is
    type Max_Integer is range System.Min_Int .. System.Max_Int;
begin
    Ada.Text_IO.Put_Line("System.Min_Int = " & Max_Integer'Image(System.Min_Int));
    Ada.Text_IO.Put_Line("System.Max_Int = " & Max_Integer'Image(System.Max_Int));
end Min_Max;

我系统上的输出:

System.Min_Int = -9223372036854775808
System.Max_Int =  9223372036854775807