“AND bit a bit” e Izquierda-relleno en C ++
-
01-10-2019 - |
Pregunta
Tengo una macro que se ve algo como esto:
Foo(x) ((x - '!') & 070)
Si llamo el siguiente código:
Foo('1') => 16
Sin embargo, si llamo el siguiente código:
(('1' - '!') & 70) => 0
Así que mi pregunta es, ¿qué está pasando aquí? ¿Por qué el cálculo x & 070
a x
pero cómputo x & 70
a 0?
Mi conjetura es que el extra 0 a la izquierda está obligando a tomar 60 2 bytes en lugar de 1. En ese caso, sería no el bit a bit y ser el siguiente?
0000 0000 0001 0000 '16
0000 0000 0100 0110 & '70
-------------------
0000 0000 0000 0000
Solución
En C ++, una constante con un 0
líder es una constante octal, no una constante decimal. Todavía es una constante entera pero 070 == 56
.
Esta es la causa de la diferencia de comportamiento.
Otros consejos
No, el 0 medios adicionales el número se lee como octal (base 8). Eso significa que no dice 70, pero 56:
0000 0000 0001 0000 '16
0000 0000 0011 1000 & '56
-------------------
0000 0000 0001 0000
agregar el prefijo a la 070
con un 0
como usted está haciendo le dice al compilador que interpretarlo como octal, no decimal. Probablemente quiere decir 70
.
Como otros han dicho, es un 070
octal (y 0x70
un hexadecimal) constante, que es donde sus mentiras problemas.
Me gustaría añadir, sin embargo, que se debe utilizar funciones inline
en lugar de macros:
inline int Foo(int x) { return (x - '!' & 070); }
C ++ ha hecho mucho para que podamos deshacernos del preprocesador para muchas cosas, porque es malo, se portan mal, y peligroso. Si se puede prescindir de él, que lo hagan.
(Y si lo usa, al menos, tener la piedad de los que tienen que lidiar con el código más tarde para hacer macros todo en mayúsculas.)