gpt4 book ai didi

cobol - 这个字母数字到数字的移动有什么问题?

转载 作者:行者123 更新时间:2023-12-01 04:36:44 25 4
gpt4 key购买 nike

当我在 PIC X 中移动一个数字时到 PIC 9数字字段的值为 0。
FOO , PIC X(400) , 第一个字节为“1”,其余 399 个为空格。移动到 PIC 9(02) BAR像这样

DISPLAY FOO
MOVE FOO to BAR
DISPLAY BAR

产量
1
0

为什么 BAR 是 0 而不是 1? [编辑:最初,'发生了什么?']

后记:NealB 说“不要编写依赖于晦涩的截断规则和/或
数据类型强制。在你所做的事情上要准确和明确。”

这让我意识到我真的很想要 COMPUTE BAR AS FUNCTION NUMVAL(FOO)包裹在 NUMERIC测试,不是 MOVE .

最佳答案

COBOL 中的数据移动是一个复杂的主题 - 但这里是
对您问题的简化答案。一些数据移动规则
直截了当,符合人们的预期。其他的有些奇怪,可能会随着
编译器选项、供应商和可能的 COBOL 标准版本(74、85、2002)。

考虑到上述情况,以下是对您的示例中发生的情况的解释。

当“大”的东西是
移动到某些“小”截断必须发生。这就是将 BAR 移至 FOO 时发生的情况。那怎么办
截断发生由接收项决定
数据类型。当接收项是字符数据(PIC X)时,最右边的字符将从发送字段中截断。
对于数字数据,最左边的数字从发送字段中截断。这种行为几乎适用于所有 COBOL
编译器。

作为这些规则的结果:

  • 当一个长的 'X' 字段 (BAR) 以 '1' 开头后跟一串空格字符被移动时
    将最左边的字符转移到较短的“X”字段中。这就是为什么在移动到另一个 PIC X 时会保留“1”的原因。
    元素。
  • 当一个长的“X”字段(BAR)被移动到一个“9”(数字)数据类型时,最右边的字符首先被移动。这就是为什么“1”丢失了,它从来没有
    移动,BAR 中的最后两个空格是。

  • 到目前为止已经足够简单了......接下来的有点复杂。究竟发生了什么是供应商、版本、编译器选项和字符集
    具体的。对于本示例的其余部分,我将假设正在使用 EBCDIC 字符集和 IBM Enterprise COBOL 编译器。一世
    还假设您的程序显示 b0 而不是 0b。

    在 COBOL 中移动是普遍合法的 PIC X数据到 PIC 9字段提供了 PIC X字段只包含数字。最多
    COBOL 编译器只查看 PIC 9 的低 4 位确定其数值时的字段。一个异常(exception)是最少的
    存储符号或缺一的有效数字。对于无符号数字,最低有效数字的高 4 位
    作为 MOVE 的结果(强制遵循不同的签名字段规则),它们被设置为 1(十六进制 F)。低 4 位被移动而没有
    强制。那么,当一个空格字符移动到 PIC 9 时会发生什么? field ?十六进制
    SPACE 的表示是“40”(ebcdic)。高 4 位“4”被翻转为“F”,低 4 位按原样移动。这导致
    包含“F0”十六进制的最低有效数字 (lsd)。这恰好是 PIC 9 中数字“0”的无符号数字表示数据项。
    其余的前导数字按原样移动(即“40”十六进制)。最终结果是 FOO 显示为
    B0.但是,如果您要执行“移动”或“显示”FOO 以外的任何操作,则剩余“数字”的高 4 位可能会被强制为零作为
    结果。这会将它们的显示特性从空格翻转为零。

    以下示例 COBOL 程序及其输出说明了这些要点。
       IDENTIFICATION DIVISION.
    PROGRAM-ID. EXAMPLE.
    DATA DIVISION.
    WORKING-STORAGE SECTION.
    01.
    05 BAR PIC X(10).
    05 FOO PIC 9(2).
    05 FOOX PIC X(2).
    PROCEDURE DIVISION.
    MOVE '1 ' TO BAR
    MOVE BAR TO FOO
    MOVE BAR TO FOOX
    DISPLAY 'FOO : >' FOO '< Leftmost trunctaion + lsd coercion'
    DISPLAY 'FOOX: >' FOOX '< Righmost truncation'
    ADD ZERO TO FOO
    DISPLAY 'FOO : >' FOO '< full numeric coercion'
    GOBACK
    .

    输出:
    FOO : > 0< Leftmost trunctaion, lsd coercion
    FOOX: >1 < Righmost truncation
    FOO : >00< full numeric coercion

    最后的话......最好不要对这种事情一无所知。不要编写依赖于晦涩截断的程序
    规则和/或数据类型强制。对你正在做的事情要准确和明确。

    关于cobol - 这个字母数字到数字的移动有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16619975/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com