PL/1 фиксированный и float, dec и bin типы данных. Разница между декабрем и бином. Сколько байт?

Я пришел из C++ и java и сейчас читаю книгу о PL/1, и у меня есть некоторые проблемы с пониманием типов данных. Сначала исправлена ​​корзина. Как я понимаю, на самом деле существует 4 фиксированных типа бинов. Они есть:

фиксированный бин (7,n) - 1 байт

фиксированный бин (15,n) - 2 байта

фиксированный бин (31,n) - 4 байта

фиксированный бин (63,n) - 8 байт

Например, если я напишу в своей программе фиксированный bin(10,n), он будет "преобразован" в фиксированный bin(15,n), потому что PC/mainfraim может хранить числа только в целых байтах. Как я знаю, существуют также фиксированные типы данных dec (m, n). Но что это за "магические числа m" для фиксированного dec 1,2,4,8 байта? Внутреннее представление в памяти фиксированного бина и фиксированного dec одинаково или различно?

А по поводу поплавка. Что такое магические числа и числа с плавающей запятой? На сколько они байтов? И является ли внутреннее представление float bin и float dec одинаковым / различным?

Я нашел только float dec(33) (думаю, 16 байт). А с плавающей запятой (21) - 4 байта, (53) - 8 байтов.

1 ответ

Решение

Как вы уже отметили "магические числа" для FIXED BINARY всегда на единицу меньше, чем число битов (степень двух) байтов. "на один меньше" - из-за знакового бита. Так что легко понять, что для FIXED BINARY UNSIGNED границы сдвинуты на единицу и составляют 8,16,32,64 соответственно.

Внутреннее представление для FIXED DECIMAL может показаться немного необычным, если вы не пришли из фона мэйнфрейма, так как он использует упакованный BCD (двоично-десятичное десятичное число), где каждая десятичная цифра занимает 4 бита, а знак обозначается еще 4 битами (шестнадцатеричное) D будучи отрицательным, гекс Cили же Fположительны). Таким образом, внутреннее представление +1287 будет (в шестнадцатеричном) 01 28 7C, Кроме того, внутренняя длина не должна быть степенью двойки, так что вы можете сказать "магические числа" для FIXED DECIMAL все нечетные числа, поскольку они полностью заполняют целое число байтов, в то время как четные числа оставляют самый левый полубайт неиспользованным.

За BINARY FLOAT Данные процессор (я предполагаю, что вы работаете на оборудовании System z) знает три внутренних типа: короткая, длинная и расширенная точность, занимающие 4, 8 или 16 байтов соответственно. Short используется для точности до 21, long для точности до 53, расширенный для чего-либо большего.

С DECIMAL FLOAT все становится немного сложнее, поскольку это зависит от того, может ли компилятор использовать внутреннее устройство с десятичной плавающей запятой (DFP). Если он может использовать верхние границы для короткой и длинной точности, равные 7 и 16, если он не может использовать его, он будет использовать двоичное внутреннее представление, а границы точности равны 6 и 16 (поскольку точность теперь означает десятичные цифры).

Источник: все эти границы взяты из справочника по языку Enterprise PL/I для z/OS V4.5.

Другие вопросы по тегам