PDA

Visualizza versione completa : [C] Conversione int to char


Nanri
05-08-2005, 01.48.40
Ho delle semplicissime cifre da 0 a 9.. come le casto in char?

Dav82
05-08-2005, 01.53.48
con il casting semplice, cio cos:


int a = 5;
char b = (char) a;

In sostanza in C i char e gli int hanno la stessa rappresentazione, si usano due tipi differenti solo per ordine, ma nulla pi ;)

SkAkKo
05-08-2005, 01.57.01
char a;
int i=5;
a=(char)i;

o printf("%c",i);

Nanri
05-08-2005, 01.57.38
no come fai te nn va.. o almeno genera un warning.. ti faccio subito un esempio.. se ho per int 50 non lo posso rendere in char quindi il tuo codice darebbe un errore.. cmq per semplici cifre mi sono trovato da solo una risposta:

char int2char(int i){
return '0'+i;
}

SkAkKo
05-08-2005, 01.57.41
o scusa Dav non avevo visto :D

Nanri
05-08-2005, 01.59.53
la soluzione di skakko l'avevo gia provata sotto linux e stranamente nn restituisce manco l'errore.. semplicemente come se nn riconoscesse il carattere castato in quella maniera

SkAkKo
05-08-2005, 02.02.34
ma tu vuoi che il numero 0 o 5 diventino il carattere 0 e 5 ?

Dav82
05-08-2005, 02.17.16
Originariamente inviato da Nanri
no come fai te nn va.. o almeno genera un warning.. ti faccio subito un esempio.. se ho per int 50 non lo posso rendere in char quindi il tuo codice darebbe un errore.. cmq per semplici cifre mi sono trovato da solo una risposta:

char int2char(int i){
return '0'+i;
}

A sto punto fai cos:


char int2char (int i){

if (0 <= i && i < 10)
return '0'+i;
return 'notAChar'; //lo so, lo so, ma ci sta bene :p
}

:p

LoryOne
05-08-2005, 08.15.48
Scusate ma per prima cosa chiedetevi un int di quanti char (chiamiamoli byte) composto e poi la soluzione vien da se ;)

Nanri
05-08-2005, 18.54.48
si voglio che il n diventi un char.. avevo un array di cifre e volevo che diventassero char...

LoryOne
06-08-2005, 19.32.38
Creare una funzione che da un int ritorni un char assolutamente inutile; in C char equivale a byte.
Il fatto che char, tradotto in italiano come carattere, noi lo intendiamo sempre come un qualsiasi carattere stampabile tra quelli identificati dal proprio codice ASCII (da 0 a 255).
Per il PC non esistono lettere ma solo numeri, quindi il numero intero 50 che appare a video come il carattere 2, per il PC sempre uguale al valore 50.
Poich 50 un valore ampiamente supportato utilizzando una maschera ad 8 bit (un byte), la dichiarazione char per una variabile atta a contenere il valore 50 chiaramente corretta.

Cosa succederebbe allora se io avessi un intero pari al valore 1320 e da questo volessi ricavarne un carattere ?
il valore 1320 molto pi grande di 255 (massimo valore supportato dal tipo char) e quindi mi aspetterei un errore.
Se mandassi in esecuzione il seguente codice:

#include <stdio.h>

main(void){
int i=1320;

printf("%c",i);
}

mi sorprenderei nel vedere stampato a video il carattere < (codice ASCII pari a 40) senza alcun errore di compilazione/esecuzione.

Anche il codice seguente mi lascerebbe stupito:

#include <stdio.h>

main(void){
int i=1320;
char c;

c=i;
printf("%i",c);
}

Perch ?
La soluzione semplice ed da ricercare nelle due parti a 16 bit (high e low) che in C compongono un intero.
In C un intero pesa in memoria 32 bit, ossia 4 byte, ossia 4 char.
Un intero quindi suddiviso in due word che prendono il nome di high word e low word di un intero.
Ricordando che noi abbiamo a che fare con i byte, possibile suddividere una word nelle sue due parti ad 8 bit chiamate rispettivamente high byte e low byte.
A questo punto,senza chiamare in causa l'algebra booleana che fa parte dei concetti di base, ricavare il low byte di un integer piuttosto semplice; basta infatti ricavare il valore in questo modo:
c=i & 0xff, ossia char=int AND 255.
A conti fatti 1320 AND 255 restituisce proprio il valore 40.
Il codice seguente chiarisce meglio il concetto:

#include <stdio.h>

main(void){
int i=1320;
char c;

c=i;
printf("%i,%i,%c",i,c,i & 0xff);
}


In ultimo, l' istruzione c=i altro non fa che assegnare a c il low byte di i.