¿Son (bool)(i & 1) e i % 2 == 1 iguales?

3 minutos de lectura

avatar de usuario
Mihran Hovsepyan

Son (bool)(i & 1) y i % 2 == 1 siempre igual donde i es int?

Nota: decir siempre me refiero a todas las plataformas (incluso cuando un byte es de 16 bits) y para todos los estándares de C y C++.

Editar:

Para todos los estándares de C y C++ donde bool existir.

  • bool no está predefinido en C. Debe #include <stdbool.h> que typedefs a _Bool (_Bool es parte del lenguaje C99)

    – pmg

    22 de junio de 2011 a las 10:36

  • @pmg: correcto, pero si alguien hace una pregunta sobre printfno digo, “printf no está predefinido en C. Debe #include <stdio.h>“. Sin embargo, hablar de bool en “todos los estándares de C” es un error, ya que no está en C89 de ninguna forma 🙂

    –Steve Jessop

    22 de junio de 2011 a las 10:39


  • Correcto: eso es lo que quise decir — bool no está predefinido en todos los estándares de C 🙂

    – pmg

    22 de junio de 2011 a las 10:41


  • mejor uso i % 2 != 0 para probar los números impares.

    – estrella azul

    22 de junio de 2011 a las 13:47

No.

Representación en complemento a 1 de intla representación de -1 es 1 ... 10por lo que difieren.

De todos modos, i % 2 puede ser negativo por negativo i (de hecho, se requiere que esté en C99 cuando no es 0), y por lo tanto no es igual a 1 para números impares negativos.

  • ¿Está seguro? Creo que el compilador maneja esta diferencia.

    – Kiril Kírov

    22 de junio de 2011 a las 10:35

  • +1: Esta es la respuesta correcta. (¡Has identificado ambas razones por las que pueden diferir!)

    –Oliver Charlesworth

    22 de junio de 2011 a las 10:36


  • @Kiril: los operadores bit a bit funcionan en la representación de bits del valor. Si -1 & 1 es 1, entonces la implementación de C no usa el complemento de 1, independientemente de lo que piense el hardware subyacente sobre el tema. Está emulando el complemento de 2 o la magnitud del signo.

    –Steve Jessop

    22 de junio de 2011 a las 10:37


  • @Kiril: << y >> tienen una definición bastante restringida para tipos firmados – usando << con un LHS negativo es un comportamiento indefinido. Usando >> con un LHS negativo es un resultado definido por la implementación. Así que sí, son inseguros. 6.5.7/4 y /5 en C99.

    –Steve Jessop

    22 de junio de 2011 a las 10:49


  • El código que usa operaciones bit a bit en tipos firmados está bastante roto de todos modos, a menos que sea por razones de optimización feroz que, por lo tanto, son totalmente específicas de la implementación y, por lo tanto, no necesita que sea portátil. Use tipos sin firmar para cosas bit a bit, o al menos requiera que los valores no sean negativos, entonces sabrá exactamente cuál es la representación. Dicho esto, cualquier cosa que no sea el complemento de 2 es extremadamente raro, por lo que es probable que documentar su código “portable solo para implementaciones del complemento de 2” no sea un inconveniente para sus usuarios.

    –Steve Jessop

    22 de junio de 2011 a las 11:45


No.

Por ejemplo, pruébalo si i es -1. -1 % 2 == -1y (bool) (-1 & 1) es 1

(Asumiendo 2-complemento)

¿Ha sido útil esta solución?