Diamo un'occhiata a ciò che accade realmente (in C (presupponendo che tu abbia il tipo di dati appropriato, come alcuni hanno sottolineato che C non ha un tipo di dati "byte", tuttavia ci sono tipi di dati a 8 bit che possono Essere aggiunto)). Se questi byte sono dichiarati nello stack, esistono nella memoria principale; ad un certo punto, i byte verranno copiati sul processore per l'operazione (sto saltando diversi passaggi importanti, come processsor cacheing ...). Una volta nel processore, saranno memorizzati nei registri; il processore eseguirà un'operazione di aggiunta su questi due registri per aggiungere i dati insieme. Ecco dove si verifica la causa della confusione. La CPU eseguirà l'operazione di aggiunta nel tipo di dati nativo (o talvolta specificato). Diciamo che il tipo nativo della CPU è una parola di 32 bit (e che quel tipo di dati è ciò che viene usato per l'operazione di aggiunta); ciò significa che questi byte saranno memorizzati in parole a 32 bit con i 24 bit superiori non impostati; l'operazione add farà effettivamente l'overflow nella parola target a 32 bit. Ma (ed ecco il bit importante) quando i dati vengono copiati dal registro allo stack, solo gli 8 bit più bassi (il byte) verranno ricopiati nella posizione della variabile di destinazione nello stack. (Si noti che c'è una certa complessità nell'imballaggio dei byte e nello stack anche qui.)
Quindi, ecco il risultato; l'add provoca un overflow (a seconda delle specifiche istruzioni del processore selezionate); i dati, tuttavia, vengono copiati dal processore in un tipo di dati della dimensione appropriata, quindi l'overflow è invisibile (e innocuo, presupponendo un compilatore scritto correttamente).
fonte
2010-11-11 17:14:42
Il risultato dovrebbe essere 93 ... –
Rimosso i tag C e C++ perché A. C e C++ non hanno un tipo di dati "byte" e B. è un comportamento non definito in base allo standard. –
@Billy ci sono equivalenti in C e C++ –