Cosa succede se assegno un valore negativo a una variabile senza segno?

Ero curioso di sapere cosa sarebbe successo se assegnassi un valore negativo a una variabile senza segno.

Il codice sarà simile a questo.

unsigned int nVal = 0; nVal = -5; 

Non mi ha dato alcun errore del compilatore. Quando ho eseguito il programma, a nVal stato assegnato uno strano valore! Potrebbe essere che il valore del complemento di qualche 2 venga assegnato a nVal ?

Per la risposta ufficiale – Sezione 4.7 conv.integral

“Se il tipo di destinazione non è firmato, il valore risultante è il numero intero senza segno congruente al numero intero sorgente (modulo 2 n dove n è il numero di bit utilizzati per rappresentare il tipo senza segno). [Nota: nella rappresentazione a complemento a due, questo la conversione è concettuale e non vi è alcun cambiamento nel pattern di bit (se non c’è troncamento). -end note]

Ciò significa essenzialmente che se l’architettura sottostante memorizza in un metodo che non è Complemento di due (come Signed Magnitude o Complemento di uno), la conversione in unsigned deve comportarsi come se fosse Complemento di due.

Assegnerà il modello di bit che rappresenta -5 (nel complemento a 2) all’int unsigned. Quale sarà un grande valore senza segno. Per 32 bit int questo sarà 2 ^ 32 – 5 o 4294967291

Verrà visualizzato come numero intero positivo del valore del numero intero massimo senza segno – 4 (il valore dipende dall’architettura del computer e dal compilatore).

BTW
Puoi verificarlo scrivendo un semplice programma tipo “ciao mondo” in C ++ e vedi tu stesso

Hai ragione, il numero intero con segno è memorizzato nel modulo di complemento a 2 e il numero intero senza segno è memorizzato nella rappresentazione binaria senza segno . C (e C ++) non distingue tra i due, quindi il valore che si ottiene è semplicemente il valore binario senza segno della rappresentazione binaria del complemento a 2.

Sì, hai ragione. Il valore attuale assegnato è qualcosa come tutti i bit impostati tranne il terzo. -1 è tutti i bit impostati (hex: 0xFFFFFFFF), -2 è tutti i bit tranne il primo e così via. Quello che vedresti è probabilmente il valore esadecimale 0xFFFFFFFB che in decimale corrisponde a 4294967291.