将COBOL二进制显示为数字

Hel*_*ena 4 cobol

我对COBOL完全不熟悉.我有一个小的COBOL程序和一个小的C文件.根据这篇文章:https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.1.0/com.ibm.zos.v2r1.ceea400/sdtpt.htm 相当于COBOL中的C有符号整数是

PIC S9(9) USAGE IS BINARY
Run Code Online (Sandbox Code Playgroud)

我想从COBOL调用C文件中的函数,并在COBOL中显示结果.我能够调用该函数,它似乎按预期运行,数据按预期传递,但我无法在COBOL中使用DISPLAY显示二进制值.

我的COBOL计划:

   IDENTIFICATION DIVISION.
   PROGRAM-ID. MSQLTST5_COBHELPER.

   DATA DIVISION.
   WORKING-STORAGE SECTION.
   01 SQLCODE PIC S9(9) USAGE IS BINARY VALUE 100.


   PROCEDURE DIVISION.
   HEAD SECTION.

   MAIN.

       DISPLAY "COBOL, sqlcode is: " SQLCODE.
       CALL "CONNECT_DEFAULT" USING SQLCODE.
       DISPLAY "COBOL, sqlcode is: " SQLCODE.

       STOP RUN.

   END PROGRAM MSQLTST5_COBHELPER.
Run Code Online (Sandbox Code Playgroud)

我正在调用的C函数:

void connect_default(int* sqlcode)
{
    printf("C, sqlcode is: %d\n", *sqlcode);
    // internal code that places the expected error code -14006 in the variable sqlcode
    printf("C, sqlcode is: %d\n", *sqlcode);
}
Run Code Online (Sandbox Code Playgroud)

运行我的COBOL程序的输出:

COBOL, sqlcode is: d
C, sqlcode is: 100
C, sqlcode is: -14006
COBOL, sqlcode is: J???
Run Code Online (Sandbox Code Playgroud)

似乎变量确实具有我给它的值100,然后在C和COBOL之间正确传递,但是当我要求COBOL显示变量时,它似乎试图挑选出具有给定ASCII码的字符而不是数值,因为显示具有ASCII码100的字符'd'而不是数字100.

如何在COBOL中将此值显示为数值?

MC *_*ror 8

为什么不使用该指令将SQLCODE字段内容传输到USAGE DISPLAY字段MOVE?它会将二进制数转换为数字.

如果格式很奇怪 - 这就是为什么:

没有SIGN SEPARATE条款的签名数字图片必须以某种方式包含符号而不占用空间,因此大多数编译器将最后一位数字与数字符号组合在一起.大多数约定使用J-1直到R-9.他们还用前导零填充数字.因此-14006将转换为00001400O,因为最后一位是6,并且因为它必须与减号相结合,所以最后一位数字变为-6,由a表示O.大致相同的推理都是重要的00000010{.

为了重新格式化数字,您实际上可以使用另一张图片,例如

pic S9(9) sign leading separate
Run Code Online (Sandbox Code Playgroud)

那将显示-14006-000014006

  • 另外需要注意的是:从Enterprise COBOL V5开始(我猜 - 我确定它在V5.2中)有一个编译选项DISPSIGN(SEP)会自动为所有`DISPLAY的签名数字项生成一个单独的符号. (2认同)
  • 当由非COBOL程序设置该值时,还要考虑COMP/Binary和COMP-5之间的区别.如果它在大型机上运行,​​则有TRUNC(BIN)编译选项,使所有COMP/Binary字段的行为就像它们被定义为COMP-5一样. (2认同)