使用GNAT,我正在尝试打印System.Min_Int
Ada.Integer_Text_IO.Put(System.Min_Int);
产生这个:
“警告:值不在”Ada.Text_Io.Integer_Io.Num“类型的范围内”
我也试过
Ada.Integer_Text_IO.Put_Line(Integer'Image(System.Min_Int));
哪个收益率:
值不在“Standard.Integer”类型的范围内
如何打印System.Min_Int
?
答案 0 :(得分:4)
System.Min_Int
和System.Max_Int
是命名数字。从逻辑上讲,它们的类型为 universal_integer 。它们可以隐式转换为整数类型(就像整数常量一样42
),但当然类型需要足够大才能保存它。
没有预定义的整数类型可以保证能够保存System.Min_Int
和System.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
答案 1 :(得分:3)
令人困惑的是,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或更好的整数typ4es,并声明适合您的问题的范围。并且每种类型的限制显然不能构建到语言甚至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范围内,我很想知道这对你的系统有什么影响。请在评论中添加您的测试结果。