“Поразрядно и” и лево-дополнение в C++

У меня есть макрос, который выглядит примерно так:

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
5
задан sohum 1 July 2010 в 18:10
поделиться

4 ответа

В C ++ константа с ведущим 0 является восьмеричной константой, а не десятичной константой. Это все еще целочисленная константа, но 070 == 56 .

Это причина различия в поведении.

12
ответ дан 18 December 2019 в 06:21
поделиться

Нет, дополнительный 0 означает, что число читается как восьмеричное (основание 8). Это означает, что здесь указано не 70, а 56:

0000 0000 0001 0000     '16 
0000 0000 0011 1000 &   '56
------------------- 
0000 0000 0001 0000 
7
ответ дан 18 December 2019 в 06:21
поделиться

Как говорили другие, 070 - это восьмеричная (и 0x70 шестнадцатеричная) константа, в которой и заключается ваша проблема.

Я бы хотел добавить, однако, что вы должны использовать встроенные функции вместо макросов:

inline int Foo(int x) { return (x - '!' & 070); }

C ++ многое сделал, чтобы позволить нам избавиться от препроцессора для многих вещей, потому что это плохо, некрасиво и опасно. Если вы можете обойтись без этого, сделайте это.
(И если вы его используете, по крайней мере, проявите милосердие к тем, кто позже будет иметь дело с вашим кодом, чтобы сделать макросы полностью прописными.)

3
ответ дан 18 December 2019 в 06:21
поделиться

Предваряя 070 символом 0, как вы делаете, компилятор интерпретирует его как восьмеричное, а не десятичное. Возможно, вы хотите сказать 70.

3
ответ дан 18 December 2019 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: