我如何在 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_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
使用 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_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