Буквенно-цифровое движение к числовому - PullRequest
1 голос
/ 26 мая 2011

Буквенно-цифровое перемещение в числовую переменную вызвало неожиданные результаты. Вот код FYR:

  DATA DIVISION.                                 
  WORKING-STORAGE SECTION.                       
  01  WS-VAR-STR       PIC X(3) VALUE SPACES.                
  01  WS-VAR-NUM       PIC 9(3) VALUE ZEROES. 
  PROCEDURE DIVISION.                            
      MOVE '1'         TO WS-VAR-STR                  
      MOVE WS-VAR-STR  TO WS-VAR-NUM
      DISPLAY 'STRING > ' WS-VAR-STR '< MOVED > ' WS-VAR-NUM '<'

      IF WS-VAR-NUM >= 40 AND <= 59
         DISPLAY 'INSIDE IF >' WS-VAR-NUM
      ELSE 
         DISPLAY 'INSIDE ELSE >' WS-VAR-NUM
      END-IF
      GOBACK                                     
      .  

    OUTPUT:
    STRING > 1  < MOVED > 1 0<
    INSIDE ELSE >1 O

В результате получился странный результат, и хотелось бы понять, почему «1» перемещается как «1 0» в числовую переменную, и, что интересно, не было никаких проблем в его создании. Делитесь своими взглядами. Спасибо за ваш интерес.

1 Ответ

3 голосов
/ 27 мая 2011

В основном вы сделали нелегальный 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 и результаты по существу не определены.

...