Veamos lo que sucede realmente (en C (suponiendo que tiene el tipo de datos apropiado, ya que algunos han señalado que C no tiene un tipo de datos de "byte"; no obstante, existen tipos de datos de 8 bits que pueden ser agregado)). Si estos bytes se declaran en la pila, existen en la memoria principal; en algún punto, los bytes se copiarán al procesador para su operación (me estoy saltando varios pasos importantes, como la caché de procesadores ...). Una vez en el procesador, se almacenarán en registros; el procesador ejecutará una operación de adición sobre esos dos registros para agregar los datos juntos. Aquí es donde ocurre la causa de la confusión. La CPU realizará la operación de agregar en el tipo de datos nativo (o algunas veces, especificado). Digamos que el tipo nativo de la CPU es una palabra de 32 bits (y que ese tipo de datos es lo que se usa para la operación de agregar); eso significa que estos bytes se almacenarán en palabras de 32 bits con los 24 bits superiores desarmados; la operación de agregar hará el desbordamiento en la palabra de 32 bits objetivo. 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 de nuevo a la ubicación de la variable objetivo en la pila. (Tenga en cuenta que aquí también existe cierta complejidad relacionada con el embalaje de bytes y la pila).
Así que aquí está el resultado; el complemento causa un desbordamiento (dependiendo de la instrucción específica del procesador elegida); Sin embargo, los datos se copian del procesador en un tipo de datos del tamaño apropiado, por lo que el desbordamiento no se ve (y es inofensivo, asumiendo un compilador debidamente escrito).
Su resultado debe ser 93 ... –
Se eliminaron las etiquetas C y C++ porque A. C y C++ no tienen ningún tipo de datos "byte", y B. es un comportamiento indefinido según el estándar. –
@Billy hay equivalentes en C y C++ –