前書き
前職でコボラーしてたときの同僚に質問されたら少し詰まったのでメモ書き
やりたいこと
サイン付数値(S9)を符号付けたまま文字型(X)にMOVEしたい。
S9 SIGN IS LEADING SEPARATE CHARACTERで定義して出力すれば同じでしょ?となるのですが、
値がゼロだったら、同じ場所に特定の文字列を出したいとかCSVデータなんかではそんな要件がよくあります。
結論から
S9 SIGN IS LEADING SEPARATE CHARACTERで定義した変数をREDEFINE句経由でXに代入することで実現できました。
S9->S9SC->X
IDENTIFICATION DIVISION.
program-id. teeeest.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 int PIC S9(8) VALUE -12345.
01 disp_rec.
02 d PIC x(9).
02 cc REDEFINES d.
03 eee PIC s9(8) SIGN IS LEADING SEPARATE CHARACTER.
PROCEDURE DIVISION.
MOVE int TO eee
DISPLAY "d:" d
EXIT.
Output
d:-00012345
なぜかS9 SIGN IS LEADING SEPARATE CHARACTERをXタイプの変数にMOVEするのだと符号が外れてしまう。
理由の追求はめんどいのでしない(笑)
この辺の情報はネット上には全然なくて困った;
IDENTIFICATION DIVISION.
program-id. teeeest.
DATA DIVISION.
WORKING-STORAGE SECTION.
77 int PIC S9(8) VALUE -12345.
77 ints PIC S9(8) SIGN IS LEADING SEPARATE CHARACTER.
77 str PIC X(9).
01 disp_rec.
02 d PIC x(9).
02 cc REDEFINES d.
03 eee PIC s9(8) SIGN IS LEADING SEPARATE CHARACTER.
PROCEDURE DIVISION.
MOVE int TO ints
MOVE ints TO str
MOVE int TO eee
DISPLAY "str:" str
DISPLAY "d :" d
EXIT.
Output
str:00012345
d :-00012345