nessuno (Normal User)
Guru^2
Messaggi: 6380
Iscritto: 03/01/2010
|
Per la somma pensavo seriamente che la facessi tu ... ... eh ... dai !
Per il risultato, sicuro che è G12345 e non C12345 ?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
perillitommaso (Normal User)
Pro
Messaggi: 186
Iscritto: 28/01/2014
|
Bhe è la somma io vorrei farla tra 2 numeri DECIMALI e cioè i due numeri decimali inseriti prima di fare la conversione, per il semplice fatto che fare la somma tra due configurazioni bcd è un casino. E comunque come mai esce quella "stringa di caratteri" ?
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6380
Iscritto: 03/01/2010
|
Tommaso ... ti ho fatto una domanda precisa, perché non rispondi?
E' G12345 o C12345 ?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
perillitommaso (Normal User)
Pro
Messaggi: 186
Iscritto: 28/01/2014
|
C12345 esce, ma cosa significa questo?
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6380
Iscritto: 03/01/2010
|
Ecco mi pareva che G non c'entrasse nulla ...
La visualizzazione del valore BCD risultato della conversione, come puoi vedere della printf che usa %X, avviene in esadecimale, in modo da controllare che tutte le cifre siano state convertite correttamente.
Dato che il segno vale 1100 oppure 1101, vedrai l'equivalente esadecimale, nel primo caso C e nel secondo D.
Quindi tutti i valori BCD positivi, visualizzati in esadecimale, cominceranno con C, tutti i negativi con D
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
perillitommaso (Normal User)
Pro
Messaggi: 186
Iscritto: 28/01/2014
|
Ma in BCD non esistono le lettere A B C D E F come sono presenti nella codifica esadecimale, il codice BCD è un codice che la massima configurazione che può diciamo ottenere è 1111 e la minima è 0000, il segno viene proprio indicato con i 4 bit, non con la lettera esadecimale
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6380
Iscritto: 03/01/2010
|
Tommaso ... fai confusione tra rappresentazione del dato e valore del dato.
Se rappresenti il segno in binario avrai 1100, se lo rappresenti in decimale sarà 12, in esadecimale sarà C, ma è la stessa cosa.
Per semplificare ho usato la printf per visualizzare il valore BCD in esadecimale, se vuoi puoi visualizzarlo in decimale (con %d) ma se vuoi visualizzare 1100 per il segno, non userai la printf ma una tua apposita funzione per trasformare il valore in binario e poi in stringa di caratteri 0 e 1.
Dal punto di vista del tuo esercizio non cambia nulla perché si parla solo di "conversione" e "addizione" non di "visualizzazione del dato BCD". Importante è che il valore del primo nibble utile sia 1100 (12) o 1101 (13).
Secondo me tu non hai ancora la preparazione adatta a svolgere questo tipo di esercizi perché ti manca la "teoria" di base ...
Ultima modifica effettuata da nessuno il 27/02/2014 alle 20:56
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
perillitommaso (Normal User)
Pro
Messaggi: 186
Iscritto: 28/01/2014
|
il mio professore mi ha regalato questo pezzetto di codice che è ancora in work in progress, non me l'ha spiegato e piano piano che inizio a capirci qualcosa ci metto qualche commento, manca comunque la somma
Codice sorgente - presumibilmente C# |
#include <stdio.h> #include <stdlib.h> int main() { int a; //numero decimale int b; char abcd[3]; //numero a in bcd char bbcd[3]; //numero b in bcd char aascii[6]; //numero a in ascii char bascii[6]; //numero b in ascii char cbcd[3]; int aabs; // int babs; int asegno;//segno di a int bsegno;//segno di b int asegnobcd; int bsegnobcd; int csegnobcd;//segno di c in bcd int somma; //somma int riporto; //riporto printf("Somme in BCD\n"); printf ("Primo numero? "); scanf ("%d", &a); printf ("Secondo numero? "); scanf ("%d", &b); if (a >= 0) { asegno = 1; asegnobcd = 0x0c; //segno di a in bcd aabs = a; //valore assoluto di a } else { asegno = -1; asegnobcd = 0x0d; aabs = -a; } sprintf (aascii, "%05d", aabs); //stampa il valore assoluto di a in 5 parti, il numero decimale verrà visualizzato a destra dopo gli 0 abcd[0] = (aascii[0] - 0x30) * 16 + (aascii[1] - 0x30); //togliamo 30h per togliere ascii e moltiplichiamo per 16 per schiftare a sinistra di 4 bit abcd[1] = (aascii[2] - 0x30) * 16 + (aascii[3] - 0x30); abcd[2] = (aascii[4] - 0x30) * 16 + asegnobcd; printf ("a=%02x%02x%02x\n", abcd[0], abcd[1], abcd[2]); if (b >= 0) { bsegno = 1; bsegnobcd = 0x0c; babs = b; } else { bsegno = -1; bsegnobcd = 0x0d; babs = -b; } sprintf (bascii, "%05d", babs); bbcd[0] = (bascii[0] & ~(0x30)) * 16 + (bascii[1] & ~(0x30)); bbcd[1] = (bascii[2] & ~(0x30)) * 16 + (bascii[3] & ~(0x30)); bbcd[2] = (bascii[4] & ~(0x30)) * 16 + bsegnobcd; printf ("b=%02x%02x%02x\n", bbcd[0], bbcd[1], bbcd[2]); //somma in bcd if ((abcd[2] & 0x0f) == (bbcd[2] & 0x0f)) { csegnobcd = abcd[2] & 0x0f; } else { if (aabs > babs) { csegnobcd = abcd[2] & 0x0f; } else { csegnobcd = bbcd[2] & 0x0f; } } somma = abcd[2] / 16 + bbcd[2] / 16; if (somma > 9) { riporto = 1; somma = somma - 10; } else { riporto = 0; } cbcd[2] = somma * 16 + csegnobcd; return 0; }
|
|
|