У меня есть макрос, который выглядит примерно так:
Foo(x) ((x - '!') & 070)
Если я называю следующий код:
Foo('1') => 16
Однако, если я называю следующий код:
(('1' - '!') & 70) => 0
Таким образом, мой вопрос, что продолжается здесь? Почему делает x & 070
вычислите к x
но x & 70
вычислить к 0?
Мое предположение - то, что дополнительный 0 слева вынуждает 60 взять 2 байта вместо 1. В этом случае, не был бы поразрядное и быть следующим образом?
0000 0000 0001 0000 '16
0000 0000 0100 0110 & '70
-------------------
0000 0000 0000 0000
В C ++ константа с ведущим 0
является восьмеричной константой, а не десятичной константой. Это все еще целочисленная константа, но 070 == 56
.
Это причина различия в поведении.
Нет, дополнительный 0 означает, что число читается как восьмеричное (основание 8). Это означает, что здесь указано не 70, а 56:
0000 0000 0001 0000 '16
0000 0000 0011 1000 & '56
-------------------
0000 0000 0001 0000
Как говорили другие, 070
- это восьмеричная (и 0x70
шестнадцатеричная) константа, в которой и заключается ваша проблема.
Я бы хотел добавить, однако, что вы должны использовать встроенные
функции вместо макросов:
inline int Foo(int x) { return (x - '!' & 070); }
C ++ многое сделал, чтобы позволить нам избавиться от препроцессора для многих вещей, потому что это плохо, некрасиво и опасно. Если вы можете обойтись без этого, сделайте это.
(И если вы его используете, по крайней мере, проявите милосердие к тем, кто позже будет иметь дело с вашим кодом, чтобы сделать макросы полностью прописными.)
Предваряя 070
символом 0
, как вы делаете, компилятор интерпретирует его как восьмеричное, а не десятичное. Возможно, вы хотите сказать 70
.