- Os números têm 5 bytes;
- O primeiro byte a $00 é um inteiro;
- Se o segundo byte estiver a $00 é positivo;
- Se o segundo byte estiver a $FF é negativo.
Note-se que, como vimos, em listagens BASIC apenas se usam representações de números positivos (com um sinal - a precede-lo, quando é um número negativo).
No entanto, internamente à ROM, os números negativos são usados em cálculos aritméticos. Uma das rotinas que usa representação de números negativos neste formato, que já lidamos nesta série de artigos no Planeta Sinclair, é a rotina de DRAW da ROM.
Voltando à representação em formato inteiro negativo:
- Os números têm 5 bytes;
- O primeiro byte a $00 é um inteiro;
- O segundo byte a $FF é negativo:
- O terceiro e quarto byte representam o número em complemento para 2;
- o quinto byte é 0.
Senão vejamos como exemplo, o número 46564:
10 PRINT 46564
5CD5 0E 00 00 E4 B5 00
Para alterarmos o número para complemento para 2, invertemos e somamos 1:
$B5E4 = 1011 0101 1110 0100
invertido = 0100 1010 0001 1011
+1 = 0100 1010 0001 1100 = $4A1C
Sendo assim, fazemos:
$5CD7=FF : POKE 23767,255
$5CD8=1C : POKE 23768,28
$5CD9=4A : POKE 23769,74
Sendo que a representação fica:
5CD5 0E 00 FF 1C 4A 00
E correndo o comando:
10 PRINT 46564
o resultado é - 46564
Para descodificar a representação de um número negativo, o mais fácil é fazer um PRINT e fazer poke dos valores a descodificar...ou:
5CD5 0E 00 FF 1C 4A 00
$4A1C = 0100 1010 0001 1100
CPL = 1011 0101 1110 0011
+1 = 1011 0101 1110 0100 = $B5E4
Nota: Um "dano colateral" de armazenar inteiros negativos neste formato, é o bug conhecido de -65536 = -1
ver The trouble with -65536
Sem comentários:
Enviar um comentário