2016-07-07 5 views
0

С комара, я пытаюсь распечатать System.Min_IntКак распечатать System.Min_Int в Ada?

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?

ответ

3

Смутно, System.Min_Int по крайней мере, одной из последних комара, как представляется Long_Integer (хотя, как Саймон указывает, что на самом деле 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 или лучше, 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 до 9223372036854775807

Если System.Min_Int больше не находится в диапазоне Long_Integer в комара/НКУ 6,1 Мне интересно посмотреть, что это делает на вашей системы. Добавьте комментарий к комментарию.

+0

'Put_Line (Long_Integer'Image (System.Min_Int)),' 'дает мне значение не в диапазоне типа "Standard.Long_Integer"' (это с gcc-gnat-6.1 на i686. – binary01

+0

См. расширенный ответ. Он работал на gcc4.9.3, но, предположительно, ограничения 'System' были расширены. Найдите« System.ads »на своем компьютере, если вы хотите проверить. целочисленный тип: 'type Big_Integer - это диапазон System.Min ..System.Max;' и создавать экземпляр целочисленного пакета ввода-вывода с этим типом. Я обновлю ответ в нескольких ... –

+1

Хорошо, это Long_Long_Integer в моей системе, поэтому Long_Long_Integer'Image. – binary01

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 

 Смежные вопросы

  • Нет связанных вопросов^_^