Created
August 21, 2015 13:54
-
-
Save leodutra/7705c27c742c93e6b0be to your computer and use it in GitHub Desktop.
Entendendo o comp 3 cobol
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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