Skip to content

Instantly share code, notes, and snippets.

@leodutra
Created August 21, 2015 13:54
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save leodutra/7705c27c742c93e6b0be to your computer and use it in GitHub Desktop.
Save leodutra/7705c27c742c93e6b0be to your computer and use it in GitHub Desktop.
Entendendo o comp 3 cobol
ENTENDENDO O FORMATO COMP-3
13 Comentarios |
Tweet
Prezados Leitores,
Este Post descreve como os dados são armazenados quando estão no formato COMP-3.
COMP-3 é um campo que coloca dois dígitos em cada byte, usando uma notação chamada Binary Coded Decimal, ou BCD. COMP-3 é um tipo de dado comum, mesmo fora do COBOL, e é bastante normal em plataformas - isto é, não é dependente do sistema operacional, língua, ou CPU. Contudo, COMP-3 não é comumente encontrado em linguagens de MICRO.
Como os dados são armazenados:
O Binary Coded Decimal (BCD) tipo de dados é tal como o nome sugere - é um valor armazenado em notação decimal (base dez), e cada dígito binário é codificado. Uma vez que um dígito só tem dez possíveis valores (0-9), pode ser representada em forma binária, com apenas 4 bits. Quatro bits é chamado de "nybble", e cada nybble contém um dígito do valor. Portanto, você pode obter dois dígitos em cada 8 bits byte. A representação normal de caracteres armazena apenas um caractere (dígito) por byte, isso significa que no caso dos números de 0(zero) a 9(nove) é usado um nybble para o digito e outro nybble para informar que trata-se de um número.
Na lista abaixo temos a representação em hexadecimal e o correspondente em EBCDIC. Notem que a diferença básica é que na representação hexadecimal os números são antecedidos do “F”:
HEX EBCDIC
F0 = 0
F1 = 1
F2 = 2
F3 = 3
F4 = 4
F5 = 5
F6 = 6
F7 = 7
F8 = 8
F9 = 9
Uma variável declarada como: PIC S9(005)V99 com valor inicial de -123,45 seria armazenado da seguinte forma:
FFFFFFFD
00123450
Onde cada grupo de dois dígitos verticais representam um byte e D0 (DZERO) representa o sinal negativo e se o número fosse positivo apareceria C0 (CZERO).
O valor em um campo COMP-3 é armazenado da seguinte forma:
Ao invés de usar meio byte (um nybble) para armazenar a zona e outro meio byte para armazenar o digito, é usado apenas o meio-byte necessário para armazenar o digito, o sinal negativo é representado por D e o positivo por C e eles são representados no final do número.
Então no exemplo acima se a variável tivesse o formato PIC S9(005)V99 o número -123,45 seria armazenado da seguinte forma:
0135
024D
Para saber quantos bytes um campo COMP-3 irá ocupar é só somar a quantidade de dígitos inteiros com o sinal e com a quantidade de dígitos decimais e dividir por 2
Exemplos:
PIC S9 (7) COMP-3.
Quantidade de bytes = (1 + 7) / 2 = 8 / 2 = 4 bytes.
PIC S9 (5) V99 COMP-3.
Quantidade de bytes = (1 + 5 + 2) / 2 = 8 / 2 = 4
PIC S9 (6) COMP-3.
Quantidade de bytes = (1 + 6) / 2 = 7 / 2 = 3,5 e deve ser arredondado para 4 bytes.
Quando a soma dos bytes do sinal com a parte inteira e a parte decimal resultar em um número ímpar, o resultado da divisão por 2 deve ser sempre arredondado para o próximo número inteiro. Isso porém acarretará na perda de meio byte. Para evitar esse problema, declare sempre as variáveis de forma que a soma do sinal com a parte inteira e a decimal resulte sempre em um número par.
Exemplo:
Ao invés de declarar PIC S9(004)V99 COMP-3, declare PIC S9(005)V99 COMP-3, pois: PIC S9(004)V99 COMP-3 = (1 + 4 + 2) / 2 = 7 / 2 = 3,5 bytes e esse resultado deve ser arredondado para 4 bytes, porém PIC S9(005)V99 COMP-3 = (1 + 5 + 2) / 2 = 8 / 2 = 4 bytes e não necessita de arredondamento.
Espero, mais uma vez, ter contribuído para o crescimento de cada um.
Até a próxima!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment