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