Переменная с использованием COMP в COBOL

Я пытаюсь понять, как переменные COBOL с предложением COMP Usage хранят значения.

Я попробовал один пример, как показано ниже

    01  VAR14          PIC S9(5) USAGE COMP.   

    MOVE 12345 TO VAR14
    DISPLAY VAR14

В SPOOL значение VAR14 приходит как 0000012345,S9(5) COMP размер 4 байта согласно руководствам, так что мое понимание VAR14 должен отображаться как 000012345, Двоичное представление, как показано ниже:

0000 0000 0000 0000 0011 0000 0011 0100‬

Может кто-нибудь, пожалуйста, помогите в понимании выходного значения 0000012345?

Спасибо

1 ответ

В IBM Enterprise COBOL существует четыре способа определения двоичного поля: COMP; КОМП-4; BINARY; КОМП-5.

Как это происходит? Вычислительное поле (сокращенно COMP, а здесь - "все вычислительные поля") - "определено разработчиком". Что означает, что такое что-то в одном компиляторе, может быть что-то в другом компиляторе или даже не иметь прямого эквивалента.

И да, вы можете кодировать ВЫЧИСЛИТЕЛЬНЫЙ, ВЫЧИСЛИТЕЛЬНЫЙ-4 и ВЫЧИСЛИТЕЛЬНЫЙ-5, если хотите. Компилятор будет счастлив.

Для стандартизации в стандарте COBOL 1985 года в качестве ИСПОЛЬЗОВАНИЯ введены ДВОЙНЫЕ И УПАКОВАННЫЕ. Для переносимости в другие компиляторы COBOL это будут лучшие ИСПОЛЬЗОВАНИЯ для полей COMP и COMP-3 (упакованные десятичные).

В чем разница между этими бинарными полями? В основном нет. COMP, COMP-4 и BINARY являются фактически синонимами друг друга в компиляторе (точнее, COMP-4 и BINARY являются синонимами COMP).

COMP-5, также известный как "нативный двоичный код", отличается. У COBOL есть то, что вы могли бы назвать "десятично-двоичными" полями (COMP и родные братья). То есть данные хранятся в двоичном виде, но их максимальные и минимальные значения являются числом и полным значением предложения PICture, которое используется в определении.

COMP PIC 9 - can contain zero to nine.
COMP PIC S99 - (signed) can contain -99 to +99.
COMP PIC 999 - can contain zero to 999.

COMP-5 отличается.

COMP PIC 9 - can contain zero to 65535.
COMP PIC S99 - (signed) can contain -32768 to +32767.
COMP PIC 999 - can contain zero to 65535.

Что происходит с COMP-5, так это то, что PICture используется для определения размера поля (как с другими двоичными полями), но каждое возможное битовое значение допустимо.

Как PICture соотносится с размером определения? PIC 9 - PIC 9(4) будут храниться в поле размером с половину слова (которое составляет два байта). PIC 9(5) - PIC 9(9) будут храниться в поле размером в слово (которое составляет четыре байта). PIC 9(10) - PIC 9(18) будут храниться в поле размером в два слова (восемь байтов).

Итак, как это различие (COMP-5 использует все биты, COMP может представлять только десятичное значение PICture) влияет на то, что определено? Разве "родной двоичный код" не звучит намного лучше и, очевидно, быстрее, чем то, что может дать "не родной"?

Разница в том, как они усекаются. И, несмотря на то, что сцинтилляции звучат как "нативные двоичные" звуки, они обычно медленнее, чем использование COMP & CO, из-за усечения.

COMP усекает до десятичного значения PICture. COMP-5 усекает до размера поля.

Рассмотрим (имена только для демонстрации, используйте только когда-либо описательные имена):

01  PROGA COMP PIC 9(4).
01  PROGB COMP-5 PIC 9(5).
01  PROGC BINARY PIC 9(4) VALUE 9999.

ADD PROGC TO PROGA
ADD PROGC TO PROGB

Помня, что PROGA имеет максимальное значение 9999, и учитывая, что 19998 легко помещается в существующий размер поля, компилятор может произвести сложение и затем усечь до десятичного значения, все на месте.

Вспоминая, что максимальное значение PROGB составляет 65535, и существует абсолютная вероятность того, что в исходном поле достаточно места для успешного добавления дополнительных 65535, компилятор должен сгенерировать временное поле, в два раза превышающее исходный размер, выполнить сложение и затем обрежьте обратно до исходного максимального значения, получив этот результат обратно в исходное поле.

ADD 1 TO PROGA
ADD 1 TO PROGB

Обратите внимание, что с этими двумя, ADD 1 TO PROGA, так как он меньше, чем 9999, все еще позволит ADD быть выполненным на месте (очевидно), но ADD 1 TO PROGB все еще потребует расширения поля и всего этого дурацкого потому что PROGB может уже иметь значение 65535, поэтому компилятор должен это учитывать.

Подходит для отображения. У вас есть COMP PIC S9(5), и вы получите 10-значный вывод. Зачем? ОК, размер вы разработали, поле длиной четыре байта. Тем не менее, вы должны получить пятизначный вывод в диапазоне от -99999 до +99999. Давайте на мгновение представим, что ваше поле было вместо COMP-5 PIC S9(5).

С COMP-5 вы все биты действительны, а для поля со знаком ваш диапазон для полного слова / слова составляет от -2 147 483 648 до +2 147 483 647. Это 10 цифр, обратите внимание. Что соответствует 10 цифрам, которые вы получили на выходе. Что случилось?

Опция компилятора TRUNC. Если вы используете опцию компилятора TRUNC(BIN), все ваши поля COMP/COMP-4/BINARY обрабатываются как COMP-5. Конец истории. У вас есть TRUNC(BIN), специально выбранный вами, вашим проектом или по умолчанию для вашего сайта. Это не обязательно хороший выбор.

Другими значениями опции компилятора TRUNC являются STD, который выполняет "нормальное" усечение для COMP/COMP-4/BINARY, и OPT, который делает все, что лучше (для производительности) в данный момент.

Обратите внимание, строго не, что TRUNC(OPT) налагает контракт на программиста. "Я не буду, не должен и даже никогда не буду допускать, чтобы поле COMP/COMP-4/BINARY имело значение, которое не соответствует его изображению. Если я это сделаю, то это моя вина, остановка, конец истории, и не плачь от меня ".

Ни в коем случае, кроме как для изучения того, как все работает, просто включите и измените настройку TRUNC. Если вы это сделаете, вы можете сломать вещи, и это может быть очень, очень тонкий разрыв.

Мой совет: TRUNC(BIN), не используйте его, если нет необходимости (кто-то решил, и у вас нет выбора); TRUNC(STD) использовать, если ваш сайт боится договора; TRUNC(OPT) используйте, если ваш сайт устраивает контракт.

Используйте COMP-5, для отдельных определений полей, где вам нужно. Где тебе нужно? Для любого места у вас есть двоичное поле, диапазон которого находится за пределами "десятичного значения" его PICture. Например, посмотрите на размер CICS COMMAREA и поле, которое указывает, насколько велик отдельный пример. Посмотрите на поле хоста VARCHAR в программе на языке COBOL. Данные, взаимодействующие с JAVA или C/C++, могут быть такими. В противном случае, для новых программ, предпочтите BINARY, который показывает, что вы в курсе событий 1985 года.

Настройка TRUNC для следственных целей.

       CBL TRUNC(STD)
       ID (or IDENTIFICATION) DIVISION.

Опции компилятора также могут быть установлены оператором PARM в JCL для компиляции, но у вас может не быть к этому доступа. CBL переопределит любое значение, установленное в PARM. Существует вариант установки, который может предотвратить использование CBL (также известный как PROCESS). Отдельные опции также могут быть "исправлены" во время установки. Если ваш сайт исправил TRUNC или заблокировал CBL, вы не сможете попробовать эти вещи.

COMP пункт использования будет называться BINARY или COMPUTATION.

COMP Предложение об использовании применимо только к числовому типу данных.

COMP Использование - это двоичное представление данных.

Данные в COMP переменные хранятся в памяти в чистом двоичном формате.

Выделение памяти для COMP ИСПОЛЬЗОВАНИЕ показано ниже.

Picture           Number of Bytes
S9 to S9(4)       2
S9(5) to S9(9)    4
S9(9) to S9(18)   8
Другие вопросы по тегам