По сути, вы совершили незаконное MOVE
. Перемещение буквенно-цифровых полей в числовые допустимо при условии, что содержимое буквенно-цифрового поля содержит только числовые символы. Этот справочник суммирует допустимые/недопустимые ходы.
Чего вы ожидали в результате?
Перенос буквенно-цифровых полей в числовые осуществляется без «преобразования». По сути, вы просто вставили одну цифру, за которой следуют два пробела, в числовое поле. "1" было в порядке, два пробела - нет. Последние два байта WS-VAR-NUM
содержат пробелы.
Но подождите... почему последний символ - ноль? Ответ на этот вопрос немного сложнее. Элементы, объявленные как PIC 9
something, представлены в Zoned Decimal. Каждая цифра зонированного десятичного числа представлена одним байтом. 4 старших бита каждого байта являются битами зоны; 4 старших бита младшего байта представляют собой знак элемента. 4 младших бита каждого байта содержат значение цифры. Ключевым моментом здесь является то, где хранится знак. Он находится в старших битах последнего байта. В вашем объявлении не было знака, поэтому оператор MOVE
сбрасывает биты знака и заменяет их числовыми старшими битами по умолчанию (помните, что единственными допустимыми символами для MOVE являются цифры, поэтому этот процесс исправления всегда должен давать правильный результат). Старшие биты зонированной десятичной цифры без знака всегда HEX F. Каковы младшие биты последнего байта? Пробел имеет двоично-десятичное шестнадцатеричное значение 40. Ноль — это шестнадцатеричное значение F0. Поскольку оператор MOVE «исправляет» знак автоматически, вы получите HEX F0 в младшем разряде, который, как вы уже догадались, равен нулю. Ни одна из других «цифр» не содержит битов знака, поэтому они остаются такими, какими они были.
Наконец, оператор DISPLAY
преобразует зонированные десятичные поля в их эквивалентное символьное представление для представления: Чистый результат: '1 0'.
Кстати Выше обсуждалось, как это работает на платформе IBM z/OS — другие наборы символов (например, ASCII) и/или другие платформы могут давать другие результаты, а не потому, что IBM делает что-то не так. , а потому, что программа выполняет недопустимое MOVE
и результаты по существу не определены.
person
NealB
schedule
26.05.2011
IF WS-VAR-NUM EQUAL 1 THEN ...
, чтобы проверить реальный контент. - person Dr. belisarius   schedule 26.05.2011