[C] Valore di z
Ciao, vorrei capire per quale motivo il valore di z è 1
Secondo me x e y sono codici in ASCII che codificano dei caratteri. Il valore di z dovrebbe essere la somma di x e y, ma la domanda è, come si è fatto ad arrivare a 1? Mi sembra molto strano...
int main(void) { char x = 0xfb; char y = 0x02; char z; z = x || y; }
Secondo me x e y sono codici in ASCII che codificano dei caratteri. Il valore di z dovrebbe essere la somma di x e y, ma la domanda è, come si è fatto ad arrivare a 1? Mi sembra molto strano...
Risposte

ad esempio in questa tabella sommando due char "2" con valore 50 troverò il char con valore 100, la "d" minuscola.

Resta da capire il perchè tu voglia sommare due char...

se vuoi convertire un numero in una stringa in "int" esiste la funzione "atoi" o "atof" per i float, dopo di che puoi sommare i due int o float normalmente

oxfb e 0x02 che cosa rappresentano, cioè io non riesco a trovarli nella tabella..
è in esadecimale
http://www.hexadecimaldictionary.com/hexadecimal/0xFB/
0X sta a significare che il numero è scritto in esadecimale, FB è la parte numerica da convertire.
posso chiederti da dove hai preso questo codice? non capisco cosa vuoi fare...
tra l'altro || dovrebbe essere l'OR logico, quindi, visto che in C il valore booleano è un int con valore=0 per FALSO e diverso da zero per VERO, probabilmente facendo l'OR di due variabili Char (di cui viene fatto il cast implicito ad int) con valore diverso da zero (VERO) avrai un risultato VERO, cioè 1, stampando l'int con il %d, stampando cin il %c avrai l'ascii corrispondente al valore 1, ovvero SOH, un carattere non stampabile che si usa come START OF HEADER: inizio dell'intestazione
http://www.hexadecimaldictionary.com/hexadecimal/0xFB/
0X sta a significare che il numero è scritto in esadecimale, FB è la parte numerica da convertire.
posso chiederti da dove hai preso questo codice? non capisco cosa vuoi fare...

tra l'altro || dovrebbe essere l'OR logico, quindi, visto che in C il valore booleano è un int con valore=0 per FALSO e diverso da zero per VERO, probabilmente facendo l'OR di due variabili Char (di cui viene fatto il cast implicito ad int) con valore diverso da zero (VERO) avrai un risultato VERO, cioè 1, stampando l'int con il %d, stampando cin il %c avrai l'ascii corrispondente al valore 1, ovvero SOH, un carattere non stampabile che si usa come START OF HEADER: inizio dell'intestazione
Quello non è un operatore bitwise, ma un operatore logico. In pratica [inline]z[/inline] è uguale a uno se almeno uno dei due caratteri è diverso da zero ed è uguale a zero altrimenti. Insomma vi state perdendo in un bicchiere d'acqua.
Detto questo, il compilatore probabilmente trasformerebbe il programma in questo
Detto questo, il compilatore probabilmente trasformerebbe il programma in questo
int main(void) {}quindi ha senso fino ad un certo punto ragionare sul valore di [inline]z[/inline].
"vict85":
Quello non è un operatore bitwise, ma un operatore logico. In pratica [inline]z[/inline] è uguale a uno se almeno uno dei due caratteri è diverso da zero ed è uguale a zero altrimenti. Insomma vi state perdendo in un bicchiere d'acqua.
è quello che ho detto.
Quando ho scritto il primo post, avevo letto un + al posto del ||,


comunque, vict85, stampando z con printf cosa dovebbe uscire? visto che è un char stampando con %c dovrebbe interpretare l'1 come codice ascii, giusto?
Detto questo, il compilatore probabilmente trasformerebbe il programma in questo
CODICE:
int main(void)
{}
quindi ha senso fino ad un certo punto ragionare sul valore di z.
lo penso anche io, in quel programma non si fa output e si fa solo un operazione tra valori determinati prima della compilazione, infatti chiedo cosa vuole fare, perchè fare l'OR tra due char?
Ipotizzo: vuoi che in z compaia il valore o di x o di y casualmente? se vuoi fare questo, non ci riuscirai sicuramente con l'operatore OR.
Matte, aiutaci ad aiutarti

In pratica sto studiando le conversioni da esadecimale/binario/IEE754 e avendo fatto un po' di programmazione in c, ho degli esercizietti su carta che devo risolvere facendo calcoli a mente.
Nelle soluzioni z mi risulta uguale a 1. Cosa molto strana...
Perchè io ho preso i due char e li ho trasformati in binario. Infatti oxfb è diventato $11111011$ e oxo2 è diventato $00000010$
poi ho applicato l'OR e mi è venuto:
$11111011$. Però guardando il valore non coincide con $1$
Ovviamente guardando su Visual studio, il valore coincide con 1, ma non riesco a capire perchè non riesco ad ottenere questo valore facendo il procedimento con carta e penna, il procedimento mi sembra abbastanza corretto..
Nelle soluzioni z mi risulta uguale a 1. Cosa molto strana...
Perchè io ho preso i due char e li ho trasformati in binario. Infatti oxfb è diventato $11111011$ e oxo2 è diventato $00000010$
poi ho applicato l'OR e mi è venuto:
$11111011$. Però guardando il valore non coincide con $1$
Ovviamente guardando su Visual studio, il valore coincide con 1, ma non riesco a capire perchè non riesco ad ottenere questo valore facendo il procedimento con carta e penna, il procedimento mi sembra abbastanza corretto..
Quello che hai scritto nel codice è un OR LOGICO || e non un OR BITWISE | . x || y è uguale a 1 perché entrambi i valori rappresentano un valore diverso da zero e quindi indicano una condizione vera in C. x | y è invece uguale al valore da te calcolato essendo l'operazione effettuata su ogni singolo bit.
okay grazie mille, adesso ho capito, ecco perchè non mi era chiaro!!
Un'ultima cosa, correggimi se sbaglio.. se fosse stato invece un OR BITWISE sarebbe invece diventato in questo caso oxfb
Sì, il risultato nel caso in cui l'operazione sia effettuata su ogni bit è 0xFB.
@apatriarca
Grazie mille!
Grazie mille!