Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Packed BCD?
Forum - C/C++ - Packed BCD? - Pagina 5

Pagine: [ 1 2 3 4 5 6 ] Precedente | Prossimo
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6380
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:22
Martedì, 25/02/2014
Per la somma pensavo seriamente che la facessi tu ... :noway: ... 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à.
PM Quote
Avatar
perillitommaso (Normal User)
Pro


Messaggi: 186
Iscritto: 28/01/2014

Segnala al moderatore
Postato alle 17:26
Mercoledì, 26/02/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" ?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6380
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:50
Mercoledì, 26/02/2014
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à.
PM Quote
Avatar
perillitommaso (Normal User)
Pro


Messaggi: 186
Iscritto: 28/01/2014

Segnala al moderatore
Postato alle 15:04
Giovedì, 27/02/2014
C12345 esce, ma cosa significa questo?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6380
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 17:11
Giovedì, 27/02/2014
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à.
PM Quote
Avatar
perillitommaso (Normal User)
Pro


Messaggi: 186
Iscritto: 28/01/2014

Segnala al moderatore
Postato alle 20:22
Giovedì, 27/02/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

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6380
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:51
Giovedì, 27/02/2014
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à.
PM Quote
Avatar
perillitommaso (Normal User)
Pro


Messaggi: 186
Iscritto: 28/01/2014

Segnala al moderatore
Postato alle 14:57
Venerdì, 28/02/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#

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main()
  5. {
  6.     int a; //numero decimale
  7.     int b;
  8.     char abcd[3]; //numero a in bcd
  9.     char bbcd[3]; //numero b in bcd
  10.     char aascii[6]; //numero a in ascii
  11.     char bascii[6]; //numero b in ascii
  12.     char cbcd[3];
  13.     int aabs; //
  14.     int babs;
  15.     int asegno;//segno di a
  16.     int bsegno;//segno di b
  17.     int asegnobcd;
  18.     int bsegnobcd;
  19.     int csegnobcd;//segno di c in bcd
  20.     int somma; //somma
  21.     int riporto; //riporto
  22.  
  23.     printf("Somme in BCD\n");
  24.     printf ("Primo numero? ");
  25.     scanf ("%d", &a);
  26.     printf ("Secondo numero? ");
  27.     scanf ("%d", &b);
  28.  
  29.     if (a >= 0) {
  30.         asegno = 1;
  31.         asegnobcd = 0x0c; //segno di a in bcd
  32.         aabs = a; //valore assoluto di a
  33.     } else {
  34.         asegno = -1;
  35.         asegnobcd = 0x0d;
  36.         aabs = -a;
  37.     }
  38.  
  39.     sprintf (aascii, "%05d", aabs); //stampa il valore assoluto di a in 5 parti, il numero decimale verrà visualizzato a destra dopo gli 0
  40.  
  41.     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
  42.     abcd[1] = (aascii[2] - 0x30) * 16 + (aascii[3] - 0x30);
  43.     abcd[2] = (aascii[4] - 0x30) * 16 + asegnobcd;
  44.  
  45.     printf ("a=%02x%02x%02x\n", abcd[0], abcd[1], abcd[2]);
  46.  
  47.     if (b >= 0) {
  48.         bsegno = 1;
  49.         bsegnobcd = 0x0c;
  50.         babs = b;
  51.     } else {
  52.         bsegno = -1;
  53.         bsegnobcd = 0x0d;
  54.         babs = -b;
  55.     }
  56.  
  57.     sprintf (bascii, "%05d", babs);
  58.  
  59.     bbcd[0] = (bascii[0] & ~(0x30)) * 16 + (bascii[1] & ~(0x30));
  60.     bbcd[1] = (bascii[2] & ~(0x30)) * 16 + (bascii[3] & ~(0x30));
  61.     bbcd[2] = (bascii[4] & ~(0x30)) * 16 + bsegnobcd;
  62.  
  63.     printf ("b=%02x%02x%02x\n", bbcd[0], bbcd[1], bbcd[2]);
  64.  
  65.     //somma in bcd
  66.     if ((abcd[2] & 0x0f) == (bbcd[2] & 0x0f)) {
  67.         csegnobcd = abcd[2] & 0x0f;
  68.     } else {
  69.       if (aabs > babs) {
  70.         csegnobcd = abcd[2] & 0x0f;
  71.       } else {
  72.         csegnobcd = bbcd[2] & 0x0f;
  73.       }
  74.     }
  75.     somma = abcd[2] / 16 + bbcd[2] / 16;
  76.     if (somma > 9) {
  77.         riporto = 1;
  78.         somma = somma - 10;
  79.     } else {
  80.         riporto = 0;
  81.     }
  82.     cbcd[2] = somma * 16 + csegnobcd;
  83.  
  84.     return 0;
  85. }


PM Quote
Pagine: [ 1 2 3 4 5 6 ] Precedente | Prossimo