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.
No.
Representación en complemento a 1 de int
la representación de -1 es 1 ... 10
por 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 == -1
y (bool) (-1 & 1)
es 1
(Asumiendo 2-complemento)
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
printf
no 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