Acabo de entrar en los foros por culpa de JuanK Estaba mirando los retos y he visto este: Bitwise OperationsSolo quería dar mi solución:CODE int checkOverflow( unsigned n1, unsigned n2 ){ int mask = 0x80; while( mask & ((n1 & mask) ^ (n2 & mask)) ) { mask >>= 1; mask &= 0x7fffffff; } return mask & (n1 & mask) & (n2 & mask);} Esta función devuelve verdadero si hay desbordamiento al sumar los números.Es para enteros de 4 bytes, pero es fácil modificarlo para otros tamaños.P.D.: El hilo del reto está cerrado, así que pongo mi solución aquí (pido perdón si no es el lugar apropiado).
hay algo extraño en este mensaje pero no importa .
¿ y como funciona ?para saber si hay desborde al sumar dos enteros solo tienes que hacer ~A>=B si esto es falso hay desborde si es verdadero no hay desborde en la suma¿ por que funciona ? es muy facil...
3º Tu método usa una comparación, lo que significa que hace una resta. Eso me da que no sería válido para el reto.
el >= no es una resta ya que el compilador lo convierte en un JB o en un JNAE segun sea mas conveniente, esta instruccion se realiza en un solo ciclo de procesamiento cosa que en una resta se haria en dos ciclos usando posiblemente SUB y una instruccion de transferencia como JA JB o las otras...
Problema a solucionar por medio de operaciones con bits : (&,|,^,~,>>,<<)
DescriptionCMP subtracts the second operand from the first but, unlike the SUB instruction, does not store the result; only the flags are changed. CMP is typically used in conjunction with conditional jumps and the SETcc instruction. (Refer to Appendix D for the list of signed and unsigned flag tests provided.) If an operand greater than one byte is compared to an immediate byte, the byte value is first sign-extended.
...(subtraction instructions SUB, SBB, DEC, AAS, DAS, CMP, and NEG)...
2º No sé si eres bueno... pero lo que tengas de bueno te falta en educación. No sé a qué viene dudar de mí nada más llegar, pero bueno... ya he visto otros mensajes tuyos en el foro y veo que la educación no es tu fuerte *mira a Nagisa*... simplemente te ignoraré.
Esta función devuelve verdadero si hay desbordamiento al sumar los números.Es para enteros de 4 bytes, pero es fácil modificarlo para otros tamaños.
Bueno si mi programa no es valido porque genera instrucciones equivalentes a una resta tu programa tampoco seria valido porque la operación >>1 es equivalente a dividir entre 2 no estoy diciendo que genera las mismas instrucciones en ensamblador estoy diciendo que mask >>= 1 es equivalente a mask /=2 ; en el programa que fue enviado antes por nagisa como solución a este reto se uso el operador != y aun así fue considerado como valido .