В вычислительной технике знаковый переперпунш — это схема кодирования, которая сохраняет знак числа, изменяя (обычно) последнюю цифру. Он используется в символьных данных на мэйнфреймах IBM такими языками, как COBOL , PL/I и RPG . [1] Его цель — сохранить символ, который в противном случае использовался бы цифрой знака. [2] Код получен из кода перфокарт Холлерита , где и цифра, и знак могут быть введены в один и тот же столбец карты. Он называется переперпуншем, потому что над цифрой в этом столбце находится 12- или 11-разрядный перфоратор для обозначения знака. Верхние три строки карты называются зонными перфораторами , [3] и поэтому числовые символьные данные, которые могут содержать переперпунши, называются зонными десятичными .
В терминологии IBM младшие четыре бита байта в памяти называются цифрой , а старшие четыре бита — зоной . [ 4] Цифровые биты содержат числовое значение от 0 до 9. Биты зоны содержат либо 'F'x, образуя символы от 0 до 9, либо позиция символа, содержащая надрез , содержит шестнадцатеричное значение, указывающее положительное или отрицательное значение, образуя другой набор символов. (Зоны A, C, E и F указывают положительные значения, B и D — отрицательные).
Инструкция PACK
на машинах архитектуры IBM System/360 преобразует знак зонного десятичного числа при преобразовании в упакованное десятичное число , а соответствующая UNPK
инструкция установит правильный переперфорированный знак его зонного десятичного вывода. [5]
PL/I использует PICTURE
атрибут для объявления зонированных десятичных данных со знаком overpunch. Каждый символ в числовом изображении, за исключением V
, который указывает положение предполагаемой десятичной точки, представляет цифру. Символ изображения T
, I
, или R
указывает на позицию цифры, которая может содержать overpunch. T
указывает, что позиция будет содержать {–I, если положительно, и {–R, если отрицательно. указывает I
, что позиция будет содержать {–I, если положительно, и 0-9, если отрицательно. R
указывает, что позиция будет содержать 0–9, если положительно, и {–R, если отрицательно.
Например, PICTURE 'Z99R'
описывает числовое поле из четырех символов. Первая позиция может быть пустой или содержать цифру 0–9. Следующие две позиции будут содержать цифры, а четвертая позиция будет содержать 0–9 для положительного числа и {–R для отрицательного. [6]
Присвоение значения 1021 изображению выше сохранит в памяти символы «1021»; присвоение -1021 сохранит «102J».
USAGE IS DISPLAY
В языке COBOL для данных без SIGN IS SEPARATE CHARACTER
указания на перепрошивку используется графический символ «S» . SIGN IS LEADING
указывает, что перепрошивка находится над первым символом поля. SIGN IS TRAILING
, размещает его над последним символом. SIGN IS TRAILING
является значением по умолчанию. [7]
Язык C не имеет возможности использовать зонную десятичную систему счисления. Компилятор IBM ILE C/C++ для System i предоставляет функции для преобразования между int
или double
и зонной десятичной системой счисления: [8]
символ EBCDIC | Цифра | Знак | Код карты [9] |
---|---|---|---|
{ | 0 | + | 12-0 |
А | 1 | + | 12-1 |
Б | 2 | + | 12-2 |
С | 3 | + | 12-3 |
Д | 4 | + | 12-4 |
Э | 5 | + | 12-5 |
Ф | 6 | + | 12-6 |
Г | 7 | + | 12-7 |
ЧАС | 8 | + | 12-8 |
я | 9 | + | 12-9 |
} | 0 | - | 11-0 |
Дж. | 1 | - | 11-1 |
К | 2 | - | 11-2 |
Л | 3 | - | 11-3 |
М | 4 | - | 11-4 |
Н | 5 | - | 11-5 |
О | 6 | - | 11-6 |
П | 7 | - | 11-7 |
В | 8 | - | 11-8 |
Р | 9 | - | 11-9 |
10} равно -100
45A равно 451
Представление знаковых символов перекодировки «не стандартизировано в ASCII, и разные компиляторы используют разные коды перекодировки». В некоторых случаях «представление не совпадает с результатом преобразования поля со знаком EBCDIC в ASCII с помощью таблицы перевода». [10] В других случаях они одинаковы, чтобы сохранить совместимость исходных данных при потере связи между кодом символа и соответствующей цифрой.
Отрицательное поле EBCDIC, заканчивающееся цифрой «1», будет кодировать эту цифру как «D1'x», заглавную «J», где цифра — «1», а зона — «D», чтобы указать на отрицательное поле. Заглавная «J» ASCII — это «4A'x», где шестнадцатеричное значение не имеет никакого отношения к числовому значению. Альтернативная кодировка использует для этого представления строчные «q», «71'x», где цифра — «1», а зона — «7». Это сохраняет цифру и последовательность сортировки за счет необходимости распознавать и переводить поля с перештамповками по отдельности.
В Gnu COBOL и MicroFocus COBOL для представления отрицательных чисел от «0» до «9» используются строчные буквы от «p» до «y». [11] [12]
Компиляторы PL/I в системах ASCII используют тот же набор символов ({, J–R), что и EBCDIC, для представления надстрочных знаков. [13]