Estimado, Deitel&Deitel, "Cómo programar en C/C++", segunda edición. en Español, 1995.
En el tema "Estructuras, uniones, manipulaciones de bits y enumeraciones", p. 407, reza:
Por otra parte, ten cuidado x64 con que la suma aritmética no siempre es igual a la suma lógica. Los resultados no son iguales en caso de que se practique una suma binaria con acarreo. Por ejemplo, la suma aritmética de b'01' y b'01' será b'10' (2 en decimal). En cambio, la misma suma lógica produce b'01'. En nuestro caso, por la teoría subyacente de sistemas numéricos sabemos que debe ser la suma aritmética.
============
Por último, respecto a lo extraño de la sentencia:
la acabo de probar en mi compilador (GNU gcc acorde con C99) y me dice que está bien, sólo recomienda revisar la prioridad de los operadores. Entonces, revisando más a fondo el asunto recorde que el operador de suma posee mayor prioridad que el de desplazamiento (sorry por el olvido ), por lo que lo correcto sería en todo caso:
y similarmente con las demás.
En el tema "Estructuras, uniones, manipulaciones de bits y enumeraciones", p. 407, reza:
CitarComo vez, lo dicen Deitel&Deitel (dos profesores con décadas de experiencia enseñando C), y no yo. Por eso digo que yo no se ...
"(...) También los programas de las secciones 10.9 y 10.10 fueron probados en una Macintosh de Apple usando Thisk C y una PC compatible, utilizando Borland C++. Ambos sistemas utilizan enteros de 16 bits (2 bytes). Dada la naturaleza de dependencia de la máquina de las manipulaciones a nivel de bits, estos programas pudieran no funcionar en su sistema"
Por otra parte, ten cuidado x64 con que la suma aritmética no siempre es igual a la suma lógica. Los resultados no son iguales en caso de que se practique una suma binaria con acarreo. Por ejemplo, la suma aritmética de b'01' y b'01' será b'10' (2 en decimal). En cambio, la misma suma lógica produce b'01'. En nuestro caso, por la teoría subyacente de sistemas numéricos sabemos que debe ser la suma aritmética.
============
Por último, respecto a lo extraño de la sentencia:
Código (cpp) [Seleccionar]
word1 = (unsigned short) buffer[1] << 8 + buffer[0];
la acabo de probar en mi compilador (GNU gcc acorde con C99) y me dice que está bien, sólo recomienda revisar la prioridad de los operadores. Entonces, revisando más a fondo el asunto recorde que el operador de suma posee mayor prioridad que el de desplazamiento (sorry por el olvido ), por lo que lo correcto sería en todo caso:
Código (cpp) [Seleccionar]
word1 = ((unsigned short) buffer[1] << 8) + buffer[0];
y similarmente con las demás.