Domanda

Possibile duplicato:
L'aggiunta di due caratteri produce int

Dato il seguente codice C++:

unsigned char a = 200;
unsigned char b = 100;

unsigned char c = (a + b) / 2;

L'output è di 150 as logicamente previsto, tuttavia non dovrebbe esserci un overflow di numeri interi nell'espressione (a + b)?

Ovviamente deve esserci una promozione di numeri interi per gestire l'overflow qui, oppure sta succedendo qualcos'altro che non riesco a vedere.Mi chiedevo se qualcuno potesse illuminarmi, così posso sapere su cosa posso e non dovrei fare affidamento in termini di promozione di numeri interi e overflow.

È stato utile?

Soluzione

Né il C++ né il C eseguono calcoli aritmetici all'interno di tipi interi "più piccoli" come, char E short.Questi tipi vengono quasi sempre promossi int prima che inizino ulteriori calcoli.Quindi, la tua espressione viene davvero valutata come

unsigned char c = ((int) a + (int) b) / 2;

PSSu qualche piattaforma esotica dove la gamma di int non copre la gamma di unsigned char, Il tipo unsigned int verrà utilizzato come tipo di target per la promozione.

Altri suggerimenti

No, questo non è un errore.

Il compilatore calcola sempre con la precisione minima dell'intero, il risultato verrà riconvertito in caratteri senza segno solo al momento dell'assegnazione.

Questo è nella norma.

Secondo altre risposte, non è un errore su x86 e altre (sane) architetture a 32 bit e 16 bit.

Tuttavia, su architetture più piccole o meno sane (tipicamente microcontrollori molto piccoli) cose come questa probabilmente inizieranno a causare problemi, soprattutto se chi ha implementato il tuo compilatore non ha il budget di test/convalida di alcune delle aziende più grandi in circolazione (di nuovo, microcontrollori).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top