Pregunta

¿Qué sucede realmente cuando un byte se desborda?

decir que tenemos

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

Si ahora hacemos esta suma

byte byte3 = byte1 + byte2;

Creo que terminaremos con byte3 = 94 pero ¿qué sucede realmente?¿Sobrescribí algún otro recuerdo de alguna manera o es totalmente inofensivo?

¿Fue útil?

Solución

Es muy sencillo. Simplemente lo hace la adición y se cae en un número con más de 8 bits. El noveno bit (siendo uno) justo 'se cae' y te quedas con los 8 bits restantes que forman el número 94.

(sí es inofensivo)

Otros consejos

En C # si tiene

 checked { byte byte3 = byte1 + byte2; }

Se producirá una excepción de desbordamiento. El código se compila unchecked por defecto. Como las otras respuestas están diciendo, el valor será 'envolver'. es decir, byte3 = (byte1 + byte2) & 0xFF;

se truncará Los bits superiores. No es perjudicial para cualquier otra memoria, sólo es perjudicial en términos de resultados no deseados.

La bandera de acarreo se pone conjunto ... pero además de que el resultado no es lo que se espera, no debe haber ningún efecto negativo.

Normalmente (y el comportamiento exacto dependerá de la lengua y de la plataforma), el resultado será tomada modulo-256. es decir, 150 + 199 = 349. 349 mod 256 = 93.

Esto no debería afectar a cualquier otro medio de almacenamiento.

Puesto que usted ha marcado su pregunta C #, C ++ y C, voy a responder sobre C y C ++. En C ++ desbordamiento de tipos firmados, incluidas sbyte (que, creo, es signed char en C / C ++) da como resultado un comportamiento indefinido. Sin embargo, para los tipos sin signo, como byte (que es unsigned char en C ++), el resultado es tomas de módulo 2 n donde n es el número de bits en el tipo sin signo. En C # la segunda regla se mantiene, y los tipos firmados generar una excepción si se encuentran en el bloque checked. Puedo estar equivocado en la parte C #.

desbordamiento es inofensivo en C # - usted no desbordamiento de la memoria - sólo tiene que obly obtener los últimos 8 bits del resultado. Si desea que esta a esta excepción, utilizar la palabra clave 'marcado'. Tenga en cuenta también que puede resultar de bytes + bytes da int, por lo que puede que tenga que volver a elenco de bytes.

El comportamiento depende del idioma.

En C y C ++, firmado desbordamiento no está definido y el desbordamiento sin firma tiene el comportamiento que usted ha mencionado (aunque no hay ningún tipo byte).

En C #, se puede utilizar la palabra clave checked a decir explícitamente que desea recibir una excepción si hay desbordamiento y la palabra clave unchecked a decir explícitamente que desea ignorar.

bit inicial acaba de caer fuera.

Y se produce desbordamiento aritmético. Desde 150 + 199 = 349, binario 1 0101 1101, la parte superior 1 bit se deja caer y el byte se convierte en 0,101 1,101; es decir, el número de bits de un byte puede contener desbordado.

No daño estaba hecho - por ejemplo, memoria ¿verdad desbordamiento a otro lugar.

Veamos lo que realmente sucede (en C (suponiendo que tenga el tipo de datos apropiado, ya que algunos han señalado que C no tiene un tipo de datos "byte";no obstante, hay tipos de datos de 8 bits que se pueden agregar)).Si estos bytes se declaran en la pila, existen en la memoria principal;en algún momento, los bytes se copiarán al procesador para su funcionamiento (me estoy saltando varios pasos importantes, como el almacenamiento en caché del procesador...).Una vez en el procesador, serán almacenados en registros;el procesador ejecutará una operación de suma en esos dos registros para sumar los datos. Aquí es donde ocurre la causa de la confusión. La CPU realizará la operación de adición en el tipo de datos nativo (o, a veces, especificado).Digamos que el tipo nativo de la CPU es una palabra de 32 bits (y que ese tipo de datos es el que se utiliza para la operación de adición);eso significa que estos bytes se almacenarán en palabras de 32 bits con los 24 bits superiores sin configurar;De hecho, la operación de adición realizará el desbordamiento en la palabra de 32 bits de destino.Pero (y aquí está el bit importante) cuando los datos se copian del registro a la pila, solo los 8 bits más bajos (el byte) se copiarán a la ubicación de la variable de destino en la pila.(Tenga en cuenta que aquí también hay cierta complejidad relacionada con el empaquetado de bytes y la pila).

Entonces, aquí está el resultado;la adición provoca un desbordamiento (dependiendo de la instrucción de procesador específica elegida);los datos, sin embargo, se copian del procesador a un tipo de datos del tamaño apropiado, por lo que el desbordamiento no se ve (y es inofensivo, asumiendo un compilador escrito correctamente).

As far as C# goes, adding two values of type byte together results in a value of type int which must then be cast back to byte.

Therefore your code sample will result in a compiler error without a cast back to byte as in the following.

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

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

See MSDN for more details on this. Also, see the C# language specification, section 7.3.6 Numeric promotions.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top