Risposte orribili a bizzeffe
Ozgur Ozcitak
Quando si esegue il cast da firmato a non firmato (e viceversa), la rappresentazione interna del numero non cambia. Ciò che cambia è il modo in cui il compilatore interpreta il bit di segno.
Questo è completamente sbagliato.
Mats Fredriksson
Quando vengono aggiunte una variabile senza segno e una con segno (o qualsiasi operazione binaria) entrambe vengono implicitamente convertite in non firmate, il che in questo caso comporterebbe un risultato enorme.
Anche questo è sbagliato. Gli ints senza segno possono essere promossi in ints se hanno la stessa precisione a causa di bit di riempimento nel tipo senza segno.
SMH
L'operazione di aggiunta comporta la conversione di int in un int senza segno.
Sbagliato. Forse lo fa e forse no.
La conversione da int senza segno a int con segno dipende dall'implementazione. (Ma probabilmente funziona come ti aspetti sulla maggior parte delle piattaforme in questi giorni.)
Sbagliato. È un comportamento indefinito se provoca overflow o se il valore viene conservato.
Anonimo
Il valore di i viene convertito in unsigned int ...
Sbagliato. Dipende dalla precisione di un int rispetto a un int senza segno.
Taylor Price
Come precedentemente risposto, è possibile eseguire il cast avanti e indietro tra firmato e non firmato senza problemi.
Sbagliato. Il tentativo di memorizzare un valore al di fuori dell'intervallo di un numero intero con segno comporta un comportamento indefinito.
Ora posso finalmente rispondere alla domanda.
Se la precisione di int è uguale a int senza segno, sarai promosso a un int con segno e otterrai il valore -4444 dall'espressione (u + i). Ora, se tu ed io avessimo altri valori, potresti ottenere un overflow e un comportamento indefinito, ma con quei numeri esatti otterrai -4444 [1] . Questo valore avrà tipo int. Ma stai provando a memorizzare quel valore in un int senza segno in modo che venga poi lanciato in un int senza segno e il valore che il risultato finirà per essere sarebbe (UINT_MAX + 1) - 4444.
Se la precisione di unsigned int è maggiore di quella di un int, l'int int con segno verrà promossa a un unsigned int producendo il valore (UINT_MAX + 1) - 5678 che verrà aggiunto all'altro int unsigned 1234. Dovremmo altri valori, che rendono l'espressione al di fuori dell'intervallo {0..UINT_MAX} il valore (UINT_MAX + 1) verrà aggiunto o sottratto fino a quando il risultato NON rientra nell'intervallo {0..UINT_MAX) e non si verificherà alcun comportamento indefinito .
Cos'è la precisione?
I numeri interi hanno bit di riempimento, bit di segno e bit di valore. Gli interi senza segno non hanno ovviamente un bit di segno. Il carattere senza segno è inoltre garantito per non avere bit di riempimento. Il numero di bit di valori di un numero intero è quanta precisione ha.
[Trabocchetti]
La dimensione della macro della sola macro non può essere utilizzata per determinare la precisione di un numero intero se sono presenti bit di riempimento. E la dimensione di un byte non deve essere un ottetto (otto bit) come definito da C99.
[1] Il trabocco può verificarsi in uno dei due punti. O prima dell'aggiunta (durante la promozione) - quando hai un int senza segno che è troppo grande per rientrare in un int. L'overflow può verificarsi anche dopo l'aggiunta anche se int senza segno rientra nell'intervallo di un int, dopo l'aggiunta il risultato potrebbe comunque traboccare.