2012-06-01 6 views
6

Capisco che 1 byte manterrà un numero da 0-255. E che un numero a 16 bit è compreso tra 0 e 65535.come convertire due byte in un numero a 16 bit?

Se sto cercando di rappresentare un numero a 16 bit utilizzando due registri separati a 8 bit ... come faccio? Come funziona la matematica?

Grazie!

+1

Che architettura e assemblatore? –

+1

Non c'è niente da convertire. Iniziate a trattare la coppia di registri come una coppia che rappresenta un numero a 16 bit. Come funziona la matematica dipende da quali istruzioni sono disponibili sulla tua piattaforma. – harold

+0

Nessun indizio. Sto lavorando con un programmatore di sistemi embedded. Dice di essere limitato. Può mandarmi un byte esadecimale. E poi un altro byte esadecimale. E dovrei essere in grado di trasformarli in un numero a 16 bit. Ma non sono sicuro di come. –

risposta

10

La matematica funziona come segue:

sixteenBitNumber = 256*upperByte + lowerByte; 

con turni e operazioni bit per bit:

sixteenBitNumber = (upperByte<<8) | lowerByte; 

Nella maggior parte delle CPU, anche alcuni arcaici quelli a 8 bit, questa interpretazione è fatto in hardware: si caricano byte in parti di un registro a 16 bit o in registri separati a 8 bit che possono funzionare come una coppia a 16 bit e l'hardware funziona con i dati come se fosse un singolo numero a 16 bit.

1

In decimale come faccio a prendere 7 e 9 e fare 79? (7 * 10) +9 o 12 e 34 e fare 1234? (12 * 100) +34. Nessun diverso 0x12 e 0x34 e creare 0x1234. (0x12 * 0x100) + 0x34. Molto più pulito rispetto allo spostamento di bit (0x12 < < 8) + 0x34. puoi o lo è pure (0x12 < < 8) | 0x34.

0

Vuoi lavorare con loro insieme? È facile

Supponiamo di avere il numero 2643 - nella base 10. se la rompi a metà, avrai qualcosa come 26 e 43, giusto? bene sai che se ti moltiplica per due, devi moltiplicare da destra a sinistra e portare. Così fai - moltiplica il lato destro, e se c'è overflow, aggiungilo sul lato sinistro e poi moltiplica il lato sinistro.

Ad esempio:

(37 82) *2  ->  ((37*2) + overflow) + 64  ->  (74 + 1) 64  ->  75 64 

vedere come ha funzionato? Lo stesso vale per la divisione - necessità di portare? Ruba dalla punta più alta. Vuoi aggiungere o sottrarre numeri? Non così difficile, dopo tutto!

I numeri binari funzionano allo stesso modo.

(01110110 10110011) * 10 = (0)  <-  1110110(1)  <-  01100110 

In pratica si calcola l'estremità inferiore, quindi calcolare l'estremità superiore, quindi si applica l'overflow.