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.