Campos Binários: COMP, COMP-4 e COMP-5 — Qual é a Diferença?

Campos binários em COBOL: COMP, COMP-4 e COMP-5
Photo by Alexander Sinn on Unsplash

Em um artigo anterior aqui no site, expliquei como funciona o campo COMP-3 (decimal compactado) e mostrei que ele não é nem binário nem ponto flutuante.

Logo, a pergunta natural é: e seu quiser criar um campo realmente binário em COBOL, como eu faço?

Na verdade, o COBOL possui dois tipos de campos binários que apresentam comportamentos diferentes, e entender a diferença entre eles é fundamental.

O Primeiro Tipo: BINARY, COMP ou COMP-4

Quando você declara uma variável assim:

01 WS-VALOR PIC S9(5) COMP.

Você está criando um campo binário. A cláusula BINARY, COMP, COMPUTATIONAL ou COMP-4 significam essencialmente a mesma coisa. Na prática, o que você mais verá em produção é COMP.

Como o tamanho é definido?

Aqui entra um ponto importante: no campo binário tradicional, o PIC funciona como fator de escala. Dependendo da quantidade de dígitos definidos na PIC, o compilador escolhe quantos bytes a variável irá ocupar:

PIC Bytes Tipo Interno Tamanho Máximo
S9(1) a S9(4) 2 Halfword -32.768 a +32.767
S9(5) a S9(9) 4 Fullword ~ ±2 bilhões
S9(10) a S9(18) 8 Doubleword ~ ±9 quintilhões

Ou seja, o número de dígitos da picture determina o tamanho físico em memória.

Se o campo não for sinalizado, o valor máximo dobra, pois todos os bits ficam disponíveis para magnitude.

O Detalhe Que Muita Gente Não Percebe: Truncamento

Aqui está o detalhe importante. No COMP tradicional, a picture não serve apenas como fator de escala para definir o tamanho em bytes. Ele também funciona como critério de truncamento.

Por exemplo, se você tiver uma variável definida como:

01 WS-VALOR PIC S9(4) COMP.

Esse campo ocupa 2 bytes e poderia armazenar até 32.767. Mas se você mover o valor 32767 para ele, o dígito 3 à esquerda será truncado, exatamente como aconteceria com um campo numérico zonado. Isso acontece porque o compilador respeita o tamanho definido pela picture do campo.

E é aqui que entra o segundo tipo de campo binário.

O Segundo Tipo: COMP-5 (Binário Nativo)

Quando você declara:

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

Você está criando um binário nativo. Ele continua usando o PIC como fator de escala para definir o tamanho físico (2, 4 ou 8 bytes). Mas existe uma diferença fundamental: No COMP-5, a picture NÃO é usado como critério de truncamento.

Se o valor couber fisicamente no número de bytes alocados para a palavra (halfword, fullword ou doubleword), ele será armazenado integralmente — mesmo que ultrapasse o número de dígitos definidos na picture.

Essa característica faz com que o COMP-5 se comporte como um inteiro binário em linguagens como C ou Java.

Demonstração Prática

Em um teste simples, se você executar o programa abaixo:

identification division.
program-id. testacomp.

data division.
working-storage section.
01 vcomp pic s9(004) comp value zeros.
01 vcomp5 pic s9(004) comp-5 value zeros.

procedure division.

move 32767 to vcomp
display vcomp

move 32767 to vcomp5
display vcomp5

stop run.

O que você vai ver na tela (ou na sysout) é o seguinte:

[d0001 ~/cbl]$ testacomp
+2767
length 2
+32767
length 2

Então Por Que Não Usar Sempre COMP-5?

Porque existe um custo. O COMP-5 introduz um overhead de processamento ao programa, ao gerar código adicional para trabalhar com valores que ultrapassam o limite da picture.

Como no mainframe tudo é feito para obter performance máxima em todos os programas, a própria IBM recomenda que:

  • COMP tradicional para programas que processam dados apenas dentro do mainframe
  • COMP-5 em programas que interagem com subsistemas como DB2, CICS ou MQ, e/ou troquem dados com outras plataformas que precisam de compatibilidade binária exata

Existe ainda uma diretiva de compilação chamada TRUNC(BIN), que pode ser usada em quase todos os compiladores, e que instrui o compilador a gerar o programa tratando campos COMP como se fossem COMP-5, ou seja, sem truncamento baseado na picture.

Mas isso também pode gerar overhead. E, assim, o uso dessa diretiva também deve seguir as recomendações da IBM.

Conclusão

O COBOL tem dos tipos de campos binários, com comportamentos distintos.

A diferença parece sutil — mas pode impactar diretamente em integridade dos dados, compatibilidade entre sistemas, performance e  cstratégias de migração.

Entender esse detalhe nos ajuda a pensar na arquitetura do sistema, e não só na funcionalidade de cada programa.