Domanda

Cosa succede quando un Byte overflow?

Dire che abbiamo

byte byte1 = 150; // 10010110  
byte byte2 = 199; // 11000111

Se ora facciamo questa aggiunta

byte byte3 = byte1 + byte2;

Penso che finiremo con byte3 = 94 ma cosa succede in realtà?Ho sovrascrivere alcuni altri di memoria, in qualche modo, o è totalmente innocuo?

È stato utile?

Soluzione

E 'abbastanza semplice. Si fa solo l'aggiunta e si stacca in un numero con più di 8 bit. Il nono bit (essendo uno) appena 'cade' e si sono lasciati con i restanti 8 bit che formano il numero 94.

(sì, è innocuo)

Altri suggerimenti

In C # se avete

 checked { byte byte3 = byte1 + byte2; }

Sarà un'eccezione di overflow. Codice viene compilato unchecked per impostazione predefinita. Come le altre risposte hanno da dire, il valore 'avvolgente'. vale a dire, byte3 = (byte1 + byte2) & 0xFF;

I bit top verrà troncato. Non è dannoso per qualsiasi altra memoria, è dannoso solo in termini di risultati imprevisti.

Il flag di carry ottiene insieme ... ma oltre il risultato non essere quello che ci si aspetta, non ci dovrebbero essere effetti negativi.

Tipicamente (e il comportamento esatta dipenderà dal linguaggio e piattaforma), il risultato sarà presa modulo-256. cioè 150 + 199 = 349. 349 mod 256 = 93.

Questo non dovrebbe colpire qualsiasi altro supporto di memorizzazione.

Dal momento che avete etichettato tua domanda C #, C ++ e C, risponderò su C e C ++. In C ++ di overflow sui tipi firmati, tra cui sbyte (che, credo, è signed char in C / C ++) si traduce in un comportamento indefinito. Tuttavia per i tipi senza segno, come byte (che è unsigned char in C ++) il risultato è introiti modulo 2 n dove n è il numero di bit nel tipo senza segno. In C # seconda regola vale, e le tipologie firmati genera un'eccezione se sono in blocco checked. Posso sbagliarmi nella parte C #.

Overflow è innocuo in c # - non sarà overflow di memoria - è sufficiente obly ottenere gli ultimi 8 bit del risultato. Se si desidera che questo a questo un'eccezione, usare la parola chiave 'controllato'. Si noti inoltre che si possono trovare byte + byte dà int, quindi potrebbe essere necessario per lanciare di nuovo a byte.

Il comportamento dipende dalla lingua.

In C e C ++, troppo pieno firmato non è definita e troppo pieno non firmato ha il comportamento che ha citato (anche se non c'è nessun tipo byte).

In C #, è possibile utilizzare la parola chiave checked esplicitamente dire si desidera ricevere un'eccezione se v'è troppo pieno e la parola chiave unchecked esplicitamente dire che si desidera ignorarlo.

po 'Leading appena lasciati.

E overflow aritmetico si verifica. Dal momento che 150 + 199 = 349, binario 1 0101 1101, la tomaia 1 bit è caduto e il byte diventa 0101 1101; cioè il numero di bit di un byte può contenere overflow.

Nessun danno è stato fatto - per esempio di memoria non ha fatto troppo pieno in un'altra posizione.

Vediamo cosa succede (in C (supponendo che hai il tipo di dati appropriato, come alcuni hanno sottolineato che la C non ha un "byte" tipo di dati;tuttavia, ci sono 8 bit tipi di dati che possono essere aggiunti)).Se questi byte sono dichiarati in pila, esistono nella memoria principale;a un certo punto, il byte da copiare per il processore per il funzionamento (sto saltando diversi passaggi importanti, come processsor cacheing...).Una volta che il processore, essi saranno memorizzati in registri;il processore esegue un'operazione di aggiunta di questi due registri per aggiungere i dati insieme. Qui è dove la causa di confusione. La CPU di eseguire l'operazione di aggiunta nella nativa (o, a volte, specificato) il tipo di dati.Diciamo che il tipo nativo della CPU è una parola di 32 bit (e che tipo di dati è quello che viene utilizzato per l'operazione di aggiunta);ciò significa che questi byte sono memorizzati in parole da 32 bit, con la parte superiore a 24 bit non impostato;l'operazione di aggiunta sarà davvero fare la overflow nel target parola di 32 bit.Ma (e qui è il bit importante) quando i dati vengono copiati dal registro di stack, solo il più basso di 8 bit (byte) sarà copiato la variabile obiettivo della posizione nello stack.(Nota che c'è una certa complessità, con il byte di imballaggio e lo stack qui.)

Così, ecco il risultato;aggiungi causa un overflow (a seconda del processore specifico di istruzioni scelto);i dati, tuttavia, copiata del processore in un tipo di dati di dimensioni adeguate, in modo che il troppo pieno è invisibile (e innocuo, assumendo una scritta correttamente il compilatore).

Per quanto riguarda C # va, aggiungendo due valori di risultati insieme tipo byte in un valore di tipo int che deve poi essere gettato di nuovo a byte.

Quindi il tuo esempio di codice si tradurrà in un errore di compilazione senza schienale cast byte come di seguito.

byte byte1 = 150; // 10010110  
byte byte2 = 199; // 11000111

byte byte3 = (byte)(byte1 + byte2);

Vedere MSDN per ulteriori dettagli su questo. Inoltre, vedere la C # linguaggio di specifica , sezione 7.3.6 promozioni numerici.

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