Translate

Mostrar mensagens com a etiqueta programador iniciante. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta programador iniciante. Mostrar todas as mensagens

quinta-feira, 29 de maio de 2025

COMP-4 e COMP-5 : Quando um Programador Cobol Padawan Descobre que um Número Pode Parecer Pequeno no PICTURE... Mas Ocupar um Universo Inteiro de Bits nos Bastidores

Bellacosa Mainframe apresenta o comp-4 e comp-5 no cobol

☕ Um Café no Bellacosa Mainframe

COMP-4 e COMP-5 sem Mistérios para Programadores COBOL

Quando um Programador Padawan Descobre que um Número Pode Parecer Pequeno no PICTURE... Mas Ocupar um Universo Inteiro de Bits nos Bastidores

Existe um momento inevitável na formação de todo programador COBOL.

Ele aprende PIC 9(5), entende COMP-3, consegue ler um arquivo sequencial sem provocar um SOC7 e começa a acreditar que finalmente domina o reino numérico do mainframe.

Então aparece isto:

05 WS-CONTADOR       PIC S9(9) COMP-4.
05 WS-CODIGO-RETORNO PIC S9(4) COMP-5.

O padawan olha para a tela verde e pergunta:

— Mestre, qual é a diferença entre COMP-4 e COMP-5?

O mestre COBOL respira fundo, olha para o teto do data center e responde:

— A diferença está em quem manda no número: o PICTURE ou o recipiente binário.

E desaparece misteriosamente para uma reunião de mudança emergencial.

Neste artigo, entraremos no interior dessas duas representações numéricas, entenderemos sua origem, formato interno, funcionamento, vantagens, riscos, opções de compilação e usos práticos. Também veremos por que dois campos aparentemente iguais podem reagir de maneira diferente ao receber o mesmo valor.


Bellacosa Mainframe e uma visão sobre numericos comp

1. Antes de tudo: o que significa COMP?

Em COBOL, a cláusula USAGE informa como um dado será representado internamente na memória.

Quando declaramos:

05 WS-IDADE PIC 9(3).

o uso padrão normalmente é DISPLAY. Isso significa que cada dígito é armazenado como um caractere.

O valor 123, em ambiente EBCDIC, poderá ocupar três bytes:

F1 F2 F3

Cada byte representa um caractere numérico.

Porém, computadores não realizam sua aritmética interna pensando em caracteres. O processador trabalha com bits, palavras, registradores e representações binárias.

As formas COMP, abreviação de COMPUTATIONAL, foram criadas justamente para permitir representações internas mais apropriadas ao processamento.

No universo IBM COBOL, encontramos tradicionalmente:

COMP ou COMP-4  = binário
COMP-1          = ponto flutuante de precisão simples
COMP-2          = ponto flutuante de precisão dupla
COMP-3          = decimal compactado
COMP-5          = binário nativo

No Enterprise COBOL para z/OS, BINARY, COMP e COMP-4 são sinônimos. Já COMP-5 representa o chamado native binary, ou binário nativo. (IBM)

Essa semelhança entre COMP-4 e COMP-5 é precisamente a origem de boa parte da confusão.

Ambos guardam números em formato binário.

Ambos podem ocupar 2, 4 ou 8 bytes.

Ambos podem ser usados em cálculos rápidos.

Mas eles não obedecem exatamente às mesmas regras de capacidade e truncamento.


Bellacosa Mainframe comp-4 versus comp-5

2. O que é COMP-4?

COMP-4, também escrito como COMPUTATIONAL-4, é sinônimo de BINARY no COBOL da IBM.

Estas declarações têm essencialmente o mesmo significado:

05 WS-VALOR PIC S9(9) BINARY.
05 WS-VALOR PIC S9(9) COMP.
05 WS-VALOR PIC S9(9) COMP-4.

No z/OS, os dados binários são armazenados em complemento de dois, com organização big-endian. O bit de sinal operacional fica associado ao lado mais significativo da representação. (IBM)

O tamanho físico do campo depende da quantidade de dígitos declarada no PICTURE:

Dígitos no PICTURETamanho
1 a 42 bytes
5 a 94 bytes
10 a 188 bytes

Portanto:

05 WS-A PIC S9(4) COMP-4.

ocupa 2 bytes.

05 WS-B PIC S9(9) COMP-4.

ocupa 4 bytes.

05 WS-C PIC S9(18) COMP-4.

ocupa 8 bytes. (IBM)

2.1 A grande característica do COMP-4

Embora o campo seja armazenado em binário, a cláusula PICTURE continua participando de sua semântica COBOL.

Veja:

05 WS-NUMERO PIC 9(4) COMP-4.

Fisicamente, o compilador reserva 2 bytes.

Dois bytes sem sinal poderiam representar valores de:

0 até 65535

Entretanto, o PICTURE 9(4) descreve formalmente um número de quatro dígitos:

0 até 9999

Aqui começa o drama.

O recipiente físico possui capacidade maior que a capacidade decimal descrita no PICTURE.

O que acontece quando tentamos armazenar 12345?

A resposta depende da operação realizada e, principalmente, da opção de compilação TRUNC.

É por isso que COMP-4 não deve ser entendido apenas como “um inteiro de 16 bits”. Ele é um item binário COBOL cujo comportamento também pode ser influenciado pela descrição decimal do PICTURE.


3. O que é COMP-5?

COMP-5 é o formato chamado pela IBM de native binary.

Exemplo:

05 WS-RETORNO PIC S9(4) COMP-5.

Fisicamente, esse campo também ocupa 2 bytes.

A diferença fundamental é que um item COMP-5 pode utilizar toda a capacidade de seu recipiente binário, em vez de ficar limitado à magnitude sugerida pela quantidade de noves do PICTURE.

A documentação da IBM explica que os itens COMP-5 podem armazenar valores até a capacidade da representação nativa de 2, 4 ou 8 bytes. Quando um valor é movido para um COMP-5, o truncamento ocorre conforme o tamanho físico binário, e não conforme o limite decimal indicado pelo PICTURE. (IBM)

Considere:

05 WS-NUMERO PIC 9(4) COMP-5.

O PICTURE tem quatro noves, mas o campo ocupa 2 bytes sem sinal.

Assim, sua capacidade binária é:

0 até 65535

E não apenas:

0 até 9999

Para um campo com sinal:

05 WS-NUMERO PIC S9(4) COMP-5.

os 2 bytes em complemento de dois permitem:

-32768 até +32767

O campo tornou-se, na prática, um inteiro binário de 16 bits.

O PICTURE ainda existe e continua sendo importante para regras sintáticas, edição, escalas decimais e operações COBOL, mas ele não limita a magnitude armazenável da mesma forma que ocorre com um binário comum submetido às regras tradicionais de truncamento.


4. A diferença em uma frase

Podemos resumir assim:

COMP-4 é um campo binário que normalmente respeita a semântica decimal definida pelo PICTURE; COMP-5 é um campo binário que utiliza a capacidade física inteira de seus 2, 4 ou 8 bytes.

Ou, no dialeto Bellacosa Mainframe:

No COMP-4, o gerente funcional chamado PICTURE ainda tenta controlar o orçamento. No COMP-5, o hardware assume a operação e utiliza todos os bits disponíveis.


5. Origem e história

O uso de representações computacionais acompanha o COBOL há décadas. Termos como COMPUTATIONAL, COMP-1, COMP-2, COMP-3 e COMP-4 surgiram em implementações históricas para representar dados em formatos adequados às arquiteturas dos computadores.

COMP-4 consolidou-se no COBOL IBM como sinônimo de BINARY.

COMP-5 surgiu posteriormente no COBOL de host IBM como uma forma explícita de representar um inteiro binário nativo, especialmente útil em interoperabilidade, interfaces de sistema e situações em que a capacidade completa da palavra binária deveria ser preservada.

A documentação de migração da IBM identifica COMP-5 como um tipo que foi novo no COBOL de host e as tabelas de palavras reservadas mostram COMP-5 e COMPUTATIONAL-5 como palavras reservadas a partir do COBOL for OS/390 & VM Version 2 Release 2, produto disponibilizado em 2000. (IBM)

Isso não significa que o conceito de inteiro nativo tenha nascido no ano 2000. Sistemas, linguagens e APIs já trabalhavam com inteiros binários muito antes disso.

O que aconteceu foi a formalização de uma maneira específica e explícita de declarar esse comportamento no COBOL de host IBM.

Antes disso, programadores dependiam mais fortemente de opções como NOTRUNC, comportamentos particulares de compiladores antigos ou convenções locais. Na migração para compiladores modernos, esses detalhes tornaram-se perigosos, pois códigos antigos às vezes armazenavam no campo binário valores maiores do que o PICTURE aparentemente permitia.

COMP-5 oferece uma declaração mais clara:

— Este campo não é apenas um número COBOL com representação binária. Ele é um recipiente binário nativo, e todos os seus bits importam.


6. Formato interno

6.1 Complemento de dois

Campos binários com sinal usam normalmente complemento de dois.

Em 16 bits:

0000 0000 0000 0001 = +1
0000 0000 0000 0010 = +2
0111 1111 1111 1111 = +32767
1000 0000 0000 0000 = -32768
1111 1111 1111 1111 = -1

A vantagem do complemento de dois é que o processador consegue realizar adições e subtrações com circuitos relativamente simples.

Não existe um caractere separado para o sinal. O sinal está incorporado ao próprio padrão binário.

6.2 Big-endian no IBM Z

O IBM Z utiliza organização big-endian para esses dados.

O byte mais significativo aparece primeiro.

Por exemplo, o valor decimal 1000 é hexadecimal:

03E8

Em dois bytes big-endian:

03 E8

Já em uma máquina little-endian, a memória poderia aparecer como:

E8 03

Essa diferença é importantíssima ao trocar estruturas binárias entre plataformas.

Enviar diretamente um campo binário de um mainframe para um servidor Intel sem definir corretamente formato, tamanho e ordem dos bytes é uma excelente forma de transformar o número 1000 em alguma criatura matemática não autorizada pelo Banco Central.


7. Tamanhos e faixas práticas

7.1 Campos com sinal

PICTURE aproximadoBytesFaixa física do COMP-5
S9(1) a S9(4)2-32.768 a 32.767
S9(5) a S9(9)4-2.147.483.648 a 2.147.483.647
S9(10) a S9(18)8-9.223.372.036.854.775.808 a 9.223.372.036.854.775.807

7.2 Campos sem sinal

PICTURE aproximadoBytesFaixa física do COMP-5
9(1) a 9(4)20 a 65.535
9(5) a 9(9)40 a 4.294.967.295
9(10) a 9(18)80 a 18.446.744.073.709.551.615

Versões modernas do COBOL IBM passaram a permitir que itens COMP-5 sem sinal utilizem todos os 16, 32 ou 64 bits. A IBM registra que esse suporte completo está disponível no COBOL for OS/390 & VM V2R2 e nos compiladores Enterprise COBOL posteriores. (IBM)

Contudo, existe um cuidado importante: nem toda operação COBOL, literal, função ou campo receptor conseguirá manipular confortavelmente toda a faixa de um inteiro de 64 bits sem sinal.

O campo pode possuir a capacidade física, mas o restante do programa também precisa estar preparado para ela.

Um hangar pode comportar um dragão. Isso não significa que a porta da cozinha também comporte.


8. Exemplo passo a passo

Considere o programa:

       IDENTIFICATION DIVISION.
       PROGRAM-ID. TESTEC45.

       DATA DIVISION.
       WORKING-STORAGE SECTION.

       01  WS-COMP4-SIGNED       PIC S9(4) COMP-4 VALUE ZERO.
       01  WS-COMP5-SIGNED       PIC S9(4) COMP-5 VALUE ZERO.

       01  WS-COMP4-UNSIGNED     PIC 9(4) COMP-4 VALUE ZERO.
       01  WS-COMP5-UNSIGNED     PIC 9(4) COMP-5 VALUE ZERO.

       01  WS-VALOR-ENTRADA      PIC 9(5) VALUE 30000.

       01  WS-EDICAO             PIC -ZZ,ZZZ,ZZ9.

       PROCEDURE DIVISION.

           DISPLAY 'TESTE COMP-4 E COMP-5'.

           MOVE WS-VALOR-ENTRADA TO WS-COMP4-SIGNED
           MOVE WS-VALOR-ENTRADA TO WS-COMP5-SIGNED

           MOVE WS-COMP4-SIGNED TO WS-EDICAO
           DISPLAY 'COMP-4 SIGNED  : ' WS-EDICAO

           MOVE WS-COMP5-SIGNED TO WS-EDICAO
           DISPLAY 'COMP-5 SIGNED  : ' WS-EDICAO

           MOVE 60000 TO WS-COMP4-UNSIGNED
           MOVE 60000 TO WS-COMP5-UNSIGNED

           MOVE WS-COMP4-UNSIGNED TO WS-EDICAO
           DISPLAY 'COMP-4 UNSIGNED: ' WS-EDICAO

           MOVE WS-COMP5-UNSIGNED TO WS-EDICAO
           DISPLAY 'COMP-5 UNSIGNED: ' WS-EDICAO

           GOBACK.

Passo 1: observe o tamanho

Todos os quatro campos têm PIC 9(4) ou PIC S9(4).

Logo, todos ocupam 2 bytes.

Porém, sua interpretação não é idêntica.

Passo 2: campo com sinal

O valor 30000 cabe em um inteiro de 16 bits com sinal:

máximo = 32767

Ele também possui cinco dígitos decimais, apesar de o campo ter sido declarado como S9(4).

No COMP-5, o valor pode ser armazenado porque cabe nos 2 bytes.

No COMP-4, o comportamento poderá ser influenciado pela opção TRUNC porque o valor ultrapassa a magnitude de quatro dígitos descrita no PICTURE.

Passo 3: campo sem sinal

O valor 60000 cabe em 16 bits sem sinal:

máximo = 65535

Mas não cabe em PIC 9(4) se interpretarmos apenas a quantidade decimal de noves:

máximo decimal descrito = 9999

O COMP-5 utiliza a capacidade binária do campo e pode armazenar 60000.

O COMP-4 pode sofrer truncamento segundo a semântica COBOL e a opção de compilação utilizada.


9. O papel da opção TRUNC

A opção TRUNC é um dos pontos mais importantes para compreender campos binários no Enterprise COBOL.

As formas mais conhecidas são:

TRUNC(STD)
TRUNC(OPT)
TRUNC(BIN)

9.1 TRUNC(STD)

Procura preservar o comportamento definido pelo padrão COBOL, considerando a quantidade de dígitos do PICTURE.

Se um resultado armazenado em um campo binário ultrapassar a quantidade decimal descrita, poderá haver truncamento para aquela precisão.

Exemplo conceitual:

05 WS-NUM PIC 9(4) COMP-4.

Ao receber:

12345

o resultado poderá ser reduzido à capacidade decimal de quatro dígitos, dependendo da operação:

2345

9.2 TRUNC(OPT)

Permite otimizações, partindo da expectativa de que os valores usados pelo programa respeitam o PICTURE.

É normalmente uma boa escolha quando o código está corretamente definido e os campos não recebem valores maiores que os declarados.

Entretanto, não deve ser usado como desculpa para depender de conteúdo fora do contrato do campo.

9.3 TRUNC(BIN)

Faz com que itens binários sejam tratados de maneira mais próxima à sua capacidade física integral.

Um campo binário comum passa a se comportar, em diversos contextos, de forma semelhante a um COMP-5.

Porém, TRUNC(BIN) é uma opção global de compilação e pode gerar código adicional, afetando desempenho. A própria IBM recomenda, quando possível, manter TRUNC(OPT) e declarar especificamente como COMP-5 os campos que realmente precisam receber valores além da precisão decimal indicada no PICTURE. (IBM)

Essa é uma decisão arquitetural importante.

Compare:

TRUNC(BIN)

Pode alterar o tratamento dos itens binários do programa inteiro.

Enquanto:

05 WS-API-RETURN-CODE PIC S9(9) COMP-5.

declara explicitamente que apenas aquele campo precisa de semântica binária nativa.

É a diferença entre reforçar uma porta e transformar o prédio inteiro em um bunker.


10. Exemplo de compilação em JCL

Um JCL simplificado poderia ser:

//COBOL    EXEC PGM=IGYCRCTL,
// PARM='LIB,OBJECT,LIST,MAP,XREF,OPT(2),TRUNC(OPT)'
//STEPLIB  DD DISP=SHR,DSN=IGY.V6R5M0.SIGYCOMP
//SYSIN    DD DISP=SHR,DSN=USER.COBOL(TESTEC45)
//SYSLIN   DD DISP=SHR,DSN=&&OBJ,
//            UNIT=SYSDA,SPACE=(TRK,(1,1)),
//            DCB=(RECFM=FB,LRECL=80,BLKSIZE=0)
//SYSPRINT DD SYSOUT=*
//SYSUT1   DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT2   DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT3   DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT4   DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT5   DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT6   DD UNIT=SYSDA,SPACE=(CYL,(1,1))
//SYSUT7   DD UNIT=SYSDA,SPACE=(CYL,(1,1))

A opção relevante é:

TRUNC(OPT)

Se todos os campos binários precisassem utilizar a capacidade física integral, poderia ser usado:

TRUNC(BIN)

Entretanto, a prática recomendável é analisar o contrato dos dados.

Campos internos comuns, contadores e valores de negócio podem continuar como COMP, COMP-4 ou BINARY.

Campos provenientes de APIs, C, estruturas do sistema operacional ou interfaces externas podem ser declarados como COMP-5.


11. Onde COMP-4 costuma ser usado?

COMP-4 é útil em:

  • contadores;

  • índices auxiliares;

  • acumuladores inteiros;

  • cálculos sem casas decimais;

  • campos cuja faixa respeita claramente o PICTURE;

  • variáveis internas de desempenho;

  • estruturas legadas que já utilizam COMP ou BINARY.

Exemplo:

05 WS-CONTADOR-REGISTROS PIC 9(9) COMP-4 VALUE ZERO.

Incremento:

ADD 1 TO WS-CONTADOR-REGISTROS

Como o campo ocupa 4 bytes, o processador pode trabalhar eficientemente com operações binárias.


12. Onde COMP-5 costuma ser usado?

COMP-5 é especialmente útil em integração com:

  • programas escritos em C;

  • APIs do sistema operacional;

  • Language Environment;

  • CICS;

  • Db2;

  • estruturas binárias;

  • códigos de retorno;

  • tamanhos de buffers;

  • comprimentos;

  • ponteiros auxiliares;

  • interfaces entre linguagens;

  • copybooks gerados por ferramentas;

  • valores que utilizam toda a capacidade de 16, 32 ou 64 bits.

A documentação de interoperabilidade entre C e COBOL recomenda COMP-5 ou TRUNC(BIN) quando um parâmetro inteiro vindo de C puder conter um valor maior do que o permitido pela quantidade de dígitos do PICTURE COBOL. (IBM)

Exemplo:

01  LK-C-PARAMETERS.
    05 LK-BUFFER-LENGTH PIC 9(9) COMP-5.
    05 LK-RETURN-CODE   PIC S9(9) COMP-5.

Em C, campos equivalentes poderiam ser:

int buffer_length;
int return_code;

O objetivo é preservar a correspondência física com o inteiro utilizado pela outra linguagem.


13. COMP-4 e COMP-5 com casas decimais

É possível declarar:

05 WS-TAXA PIC S9(5)V99 COMP-4.

ou:

05 WS-TAXA PIC S9(5)V99 COMP-5.

Não existe ponto decimal armazenado.

O V é um ponto decimal implícito.

O valor:

123.45

é armazenado internamente como o inteiro escalado:

12345

O compilador sabe que existem duas casas decimais implícitas.

Entretanto, para valores monetários, COMP-3 costuma ser mais natural, previsível e compatível com a matemática decimal de negócios.

Exemplo:

05 WS-VALOR-MONETARIO PIC S9(9)V99 COMP-3.

Valores financeiros são expressos em base decimal. Usar decimal compactado reduz certas surpresas de conversão e preserva a precisão decimal esperada.

COMP-4 e COMP-5 brilham principalmente com inteiros, contadores, comprimentos, flags numéricas e interfaces de baixo nível.


14. Vantagens do COMP-4

Uso eficiente de memória

Um PIC S9(9) DISPLAY ocupa nove bytes.

Um PIC S9(9) COMP-4 ocupa quatro bytes.

Em milhões de registros ou grandes tabelas internas, essa diferença pode ser relevante.

Aritmética eficiente

Processadores trabalham naturalmente com valores binários. Contadores e cálculos inteiros podem ser executados eficientemente.

Compatibilidade histórica

COMP, COMP-4 e BINARY aparecem em uma enorme quantidade de sistemas COBOL existentes.

Intenção clara

A declaração mostra que o campo foi criado para processamento, e não para apresentação direta.


15. Desvantagens do COMP-4

Dependência das regras de truncamento

O campo físico pode armazenar um valor, mas o PICTURE pode declarar uma capacidade decimal menor.

Influência da opção TRUNC

Uma recompilação com opções diferentes pode revelar dependências escondidas no código legado.

Não é legível diretamente

Abrir um arquivo binário em um editor de texto não mostrará os dígitos de maneira compreensível.

Portabilidade

Tamanho, endianness e comportamento podem variar entre plataformas e implementações COBOL.

Risco em interfaces

Um programa externo pode preencher todos os bits, enquanto o programa COBOL espera um valor limitado pelo PICTURE.


16. Vantagens do COMP-5

Utiliza toda a capacidade binária

É ideal quando 2, 4 ou 8 bytes devem ser tratados como um verdadeiro inteiro binário.

Excelente para interoperabilidade

Facilita o mapeamento com inteiros de C, APIs, estruturas de sistema e interfaces técnicas.

Intenção explícita

O programador que lê o código entende que aquele campo pode ultrapassar a magnitude decimal indicada pelos noves do PICTURE.

Evita o uso global de TRUNC(BIN)

É possível aplicar a semântica de binário nativo apenas aos campos necessários.

Preserva valores externos

Reduz o risco de perder dígitos de um valor recebido por interface.


17. Desvantagens do COMP-5

Pode surpreender quem confia apenas no PICTURE

Um campo declarado como:

PIC 9(4) COMP-5

pode conter 60000.

Para um iniciante, isso parece uma violação das leis naturais do COBOL.

Pode causar problemas ao mover para DISPLAY

Considere:

05 WS-NATIVO PIC 9(4) COMP-5.
05 WS-TEXTO  PIC 9(4).

Se WS-NATIVO contiver 60000:

MOVE WS-NATIVO TO WS-TEXTO

o receptor possui apenas quatro posições.

O problema não estava no COMP-5. Estava no contrato inadequado do campo receptor.

Pode esconder incompatibilidades

Duas plataformas podem usar tamanhos ou ordem de bytes diferentes.

Não é a escolha padrão para dinheiro

Valores monetários e cálculos decimais normalmente ficam mais claros em COMP-3.


18. Como visualizar o conteúdo hexadecimal

Um pequeno programa pode redefinir o campo:

01  WS-BINARIO.
    05 WS-VALOR PIC S9(4) COMP-5.

01  WS-BINARIO-X REDEFINES WS-BINARIO.
    05 WS-BYTES PIC X(2).

Em compiladores modernos, funções intrínsecas podem ajudar:

MOVE 1000 TO WS-VALOR

DISPLAY 'VALOR: ' WS-VALOR
DISPLAY 'HEX  : ' FUNCTION HEX-OF(WS-BYTES)

A representação esperada para 1000 em dois bytes big-endian é:

03E8

Para -1, em complemento de dois:

FFFF

Esse tipo de teste é excelente para compreender copybooks, dumps e integrações.


19. Cuidados ao usar REDEFINES

Nunca presuma que um campo binário pode ser interpretado como texto.

Isto:

01 WS-CAMPO.
   05 WS-NUMERO PIC S9(9) COMP-5.

01 WS-TEXTO REDEFINES WS-CAMPO.
   05 WS-CARACTERES PIC X(4).

não converte o número em texto.

Ele apenas oferece outra visão dos mesmos quatro bytes.

Se WS-NUMERO contém 123, WS-CARACTERES não conterá os caracteres:

"0123"

Ele conterá os bytes binários:

00 00 00 7B

REDEFINES não converte.

REDEFINES não formata.

REDEFINES não pergunta se você tem certeza.

Ele apenas remove a tampa do reator nuclear.


20. Boas práticas para o programador padawan

20.1 Escolha o tipo pela função

Use DISPLAY quando o dado for principalmente texto, entrada ou saída humana.

Use COMP-3 para dinheiro e cálculos decimais exatos.

Use COMP-4 ou BINARY para contadores e números inteiros que respeitam a faixa declarada.

Use COMP-5 para inteiros nativos e interfaces que exigem toda a capacidade binária.

20.2 Declare a faixa real quando possível

Embora isto seja permitido:

05 WS-LENGTH PIC 9(4) COMP-5.

pode ser mais claro declarar:

05 WS-LENGTH PIC 9(5) COMP-5.

se o valor esperado pode alcançar 65535.

A declaração deve comunicar a intenção humana, não apenas satisfazer o compilador.

20.3 Conheça a opção TRUNC

Nunca analise um programa com campos binários sem verificar as opções de compilação.

Procure no listing:

TRUNC(STD)
TRUNC(OPT)
TRUNC(BIN)

20.4 Não copie binário diretamente entre plataformas

Defina:

  • número de bytes;

  • presença de sinal;

  • ordem dos bytes;

  • escala decimal;

  • faixa permitida;

  • tratamento de overflow.

20.5 Use campos de edição no DISPLAY

Evite:

DISPLAY WS-COMP5

Prefira:

MOVE WS-COMP5 TO WS-EDITADO
DISPLAY WS-EDITADO

Exemplo:

05 WS-EDITADO PIC -ZZZ,ZZZ,ZZ9.

20.6 Teste os limites

Para 2 bytes com sinal, teste:

-32768
-32767
-1
0
1
32766
32767
32768

Para 2 bytes sem sinal, teste:

0
1
9999
10000
32767
32768
65535
65536

Os bugs mais interessantes não moram no valor médio.

Eles vivem na fronteira, fumando cigarro e esperando o batch de fechamento.


21. Curiosidades

COMP nem sempre significa binário em todas as plataformas

No Enterprise COBOL para z/OS, COMP é equivalente a BINARY.

Entretanto, em outras famílias e ambientes históricos, aliases podem variar. No IBM i, por exemplo, a documentação tradicional associa COMP-4 a BINARY, enquanto outros nomes computacionais podem refletir convenções específicas da plataforma. (IBM)

Portanto, nunca transporte conhecimento entre compiladores sem consultar a documentação daquele ambiente.

O PICTURE não determina sozinho o tamanho em bytes

Nos campos binários, faixas de dígitos são agrupadas:

1 a 4 dígitos  = 2 bytes
5 a 9 dígitos  = 4 bytes
10 a 18 dígitos = 8 bytes

Assim:

PIC 9(5) COMP-4

e:

PIC 9(9) COMP-4

ocupam ambos quatro bytes.

Um único nove pode custar dois bytes extras

Compare:

PIC 9(4) COMP-4

Dois bytes.

PIC 9(5) COMP-4

Quatro bytes.

Apenas um nove adicional fez o campo atravessar a fronteira entre halfword e fullword.

COMP-5 é comum em código gerado

Tradutores, preprocessadores e ferramentas de integração podem gerar campos COMP-5 porque precisam mapear tamanhos, comprimentos e códigos de retorno de maneira previsível.

A própria IBM informa que o coprocessador CICS usa tipos COMP-5 em situações nas quais o truncamento não deve ocorrer. (IBM)


22. Easter egg do data center

Diz a lenda que, em algum sistema bancário criado em 1997, existe a seguinte declaração:

05 WS-TAMANHO PIC 9(4) COMP.

Durante vinte anos, o campo recebeu valores menores que 9999.

Então uma modernização aumentou o buffer para 32000.

O programa continuou funcionando porque o compilador antigo, as opções históricas e os caminhos de execução permitiam que o valor sobrevivesse dentro dos 2 bytes.

Anos depois, alguém recompilou o programa com um compilador moderno e outra opção TRUNC.

O valor 32000 voltou da operação transformado em algo inesperado.

Sete reuniões foram marcadas.

Três fornecedores foram acusados.

Uma API REST foi criada sem necessidade.

Um arquiteto sugeriu Kubernetes.

Até que uma programadora júnior abriu o listing e perguntou:

— Por que este campo é PIC 9(4) se recebe 32000?

O silêncio que se seguiu foi registrado pelo SMF como consumo anormal de CPU emocional.


23. Comparação final

CaracterísticaCOMP-4COMP-5
Nome conceitualBinárioBinário nativo
Sinônimo de BINARYSimNão exatamente
RepresentaçãoComplemento de doisComplemento de dois
Tamanhos comuns2, 4 ou 8 bytes2, 4 ou 8 bytes
Capacidade ligada ao PICTURENormalmente, simCapacidade física do campo
Influência de TRUNCSimNão da mesma maneira
Bom para contadoresSimSim
Bom para integração com CPossível, com cuidadosRecomendado
Usa todos os bitsDepende das regras e opçõesSim
Clareza para valores nativosMenorMaior
Melhor escolha para dinheiroNormalmente nãoNormalmente não
Risco principalTruncamento inesperadoValor maior que o receptor espera

24. Conclusão

COMP-4 e COMP-5 não são apenas dois nomes misteriosos encontrados em copybooks antigos.

Eles representam dois contratos diferentes entre o programa COBOL e a memória.

COMP-4, equivalente a BINARY, armazena números em formato binário, mas continua ligado à descrição decimal do PICTURE e às regras de truncamento escolhidas na compilação.

COMP-5 declara que o campo deve ser tratado como um inteiro binário nativo, utilizando toda a capacidade física de seus 2, 4 ou 8 bytes.

O padawan precisa guardar cinco ensinamentos:

  1. COMP-4 é sinônimo de BINARY.

  2. COMP-5 utiliza a capacidade integral do recipiente binário.

  3. O tamanho depende da quantidade de dígitos do PICTURE.

  4. A opção TRUNC pode alterar o comportamento de campos binários comuns.

  5. Nunca escolha um tipo apenas porque ele “parece mais rápido”.

Escolha-o porque compreende o contrato, a origem do dado, sua faixa, seu destino e a forma como será processado.

No mainframe, um campo numérico nunca é apenas um campo numérico.

Ele é um acordo diplomático entre o COBOL, o compilador, o processador, o copybook, a plataforma externa e aquele programa de 1998 que ninguém recompila porque o último profissional que entendia o código se aposentou e agora cria orquídeas no interior de Minas Gerais.

E essa, jovem padawan, é a verdadeira diferença entre conhecer a sintaxe e compreender o sistema.