Overflow di numeri interi: perché no [duplicare]
-
14-11-2019 - |
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.
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).