operazione sopra valore int

Ciao,
si può fare questa operazione anche se il valore supera l'int?

unsigned int pippo = 65536 - pippo1;

il valore numerico entra dentro la variabile andando fuori dalla memoria? oppure è il risultato che conta?
Grazie

65536 in binario é 1 000 000 0000 0000. Un unsigned INT contiene solo i 16 bit piú bassi percui 0000 0000 0000 0000.
Ciao Uwe

Sì, ma se pippo1 vale 0, il risultato in un unsigned int non ci sta!

SukkoPera:
Sì, ma se pippo1 vale 0, il risultato in un unsigned int non ci sta!

Vero, questo perché 65536 - 0 = 65536, ovvero 0b10000000000000000 in binario, dato quando fai l’assegnazione ad un int di un valore maggiore perdi tutti i bit dopo il sedicesimo il risultato è 0.
Peggio ancora se fai 65536 - 65537 = -1, dato che il valore viene assegnato ad un unsigned int e in esadecimale -1 su un long int è 0xffffffff, in binario sono 32 1, ne consegue che troncando tutti i bit superiori a 16 nel unsigned int ci va a finire 0xffff, ovvero 65535 :slight_smile:

Grazie, la domanda si riferiva se lavorando con degli interi, quel valore scritto li potesse dare fastidio in qualche modo, sia pippo che pippo1 sono unsigned long, pippo1 non avrà mai valore zero e il risultato su pippo non sarà mai fuori del valore dell'intero, mi suonava male quel numero, e pensavo potesse dare fastidio a qualcosa, magari nel caso venisse assegnato a pippo prima di fare la sottrazione di pippo1...
In soatanza sarebbe meglio non farlo...

Non è necessariamente vero che è meglio non farlo, devi solo tenere presente che stai facendo la differenza di due unsigned long e che se vuoi memorizzare quest'ultima in una variabile di dimensione minore sta a te accertarti che il risultato rientri sempre nel range atteso.

Ok, allora se l'operazione in se non crea problemi, farò solo attenzione al risultato :wink:
Grazie

Sì, ma l'attenzione al risultato devi farla PRIMA di fare l'operazione, è questo il nodo cruciale :).

Bhè, si, comunque so il range del risultato... :wink: