quinta-feira, 7 de maio de 2020

Representação numérica em BASIC (II) - inteiros negativos

Como mencionado no artigo da representação de números inteiros no formato da calculadora RPN do Spectrum:
  • 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.
Embora o editor de BASIC não insira números negativos na representação de números em BASIC, nada impede de estes serem colocados, e podemos alterar números para os colocar na representação negativa.

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:

Trabalhando para trás no exemplo de -46564:

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:

Publicar um comentário