« Et Bitwise » et gauche Rembourrage en C ++
-
01-10-2019 - |
Question
J'ai une macro qui ressemble à quelque chose comme ceci:
Foo(x) ((x - '!') & 070)
Si j'appelle le code suivant:
Foo('1') => 16
Cependant, si j'appelle le code suivant:
(('1' - '!') & 70) => 0
Alors, ma question est, ce qui se passe ici? Pourquoi x & 070
Compute à x
mais x & 70
Compute à 0?
Je suppose que le 0 supplémentaire à gauche oblige 60 à prendre 2 octets au lieu de 1. Dans ce cas, ne serait pas le & bitwise être comme suit?
0000 0000 0001 0000 '16
0000 0000 0100 0110 & '70
-------------------
0000 0000 0000 0000
La solution
C ++, une constante avec un conduit 0
est une constante octal, pas une constante décimale. Il est encore une constante entière mais 070 == 56
.
Ceci est la cause de la différence de comportement.
Autres conseils
n, les moyens supplémentaires 0 le numéro est lu comme octal (base 8). Cela signifie qu'il ne dit pas 70, mais 56:
0000 0000 0001 0000 '16
0000 0000 0011 1000 & '56
-------------------
0000 0000 0001 0000
Préfixer la 070
avec un 0
comme vous faites indique au compilateur de l'interpréter comme octal, pas décimal. Vous voulez sans doute dire 70
.
Comme d'autres ont dit, 070
est un octal (et 0x70
hexadécimal) constante, ce qui est l'endroit où se trouve votre problème.
Je voudrais ajouter, cependant, que vous devez utiliser les fonctions inline
au lieu de macros:
inline int Foo(int x) { return (x - '!' & 070); }
C ++ a fait beaucoup pour nous permettre de se débarrasser de la préprocesseur pour beaucoup de choses, parce qu'il est mauvais, mauvais comportement, et dangereux. Si vous pouvez le faire sans elle, le faire.
(Et si vous l'utilisez, au moins la pitié de ceux qui ont à traiter votre code plus tard pour faire des macros tout en majuscules.)