2010-04-18 3 views
6

У меня в моем коде есть #define. Теперь странная проблема подкралась.Значение C неожиданно определяет изменения

У меня есть это:

#define _ImmSign 010100 

(Я пытаюсь моделировать двоичное число)

Очевидно, я ожидаю, что число стать 10100. Но когда я использую номер он изменился в 4160.

Что здесь происходит? И как это остановить?

ДОПОЛНИТЕЛЬНЫЕ

Итак, это связано с языком интерпретации это как восьмеричное. Есть ли какой-нибудь умный способ, чтобы заставить язык интерпретировать числа как целые числа? Если ведущий 0 определяет восьмеричной и шестнадцатеричной 0x определяет теперь, когда я думаю об этом ...

+3

010100 в восьмеричной 0 * 1 + 0 * 8 + 1 * 64 + 0 * 512 + 1 * 4096 = 64 + 4096 = 4160. –

+0

http://www.boost.org/doc/libs/1_42_0/libs/utility/utility.htm#BOOST_BINARY Это может быть полезно для вас. хотя C++, я думаю, что это препроцессор только – Anycorn

+0

@aaa thx для предложения, но я не думаю, что мне разрешено использовать стороннюю библиотеку. – NomeN

ответ

1

Если вы готовы написать непортабельному код и использовать GCC, вы можете использовать binary constants extension:

#define _ImmSign 0b010100 
+1

argh ... Я искал это несколько раз, но он никогда не появлялся в google. SO пород! – NomeN

13

Целые литералы, начинающиеся с 0 интерпретируются как восьмеричные, а не десятичную, таким же образом, что целые литералы, начинающиеся с 0x трактуются как шестнадцатеричный.

Снимите передний ноль, и вам должно быть хорошо идти.

Обратите внимание, что идентификаторы, начинающиеся с символа подчеркивания, за которым следует большая буква или другое подчеркивание, зарезервированы для реализации, поэтому вы не должны определять их в своем коде.

+0

быстрый ответ! Есть ли другой способ остановить это, а затем удалить начальный ноль? – NomeN

+2

@NomeN: Нет; это фундаментальная часть языка. –

4

Префикс целого числа с 0 делает его восьмеричным числом вместо десятичного, а 010100 в восьмеричном - 4160 десятичным.

+0

другой быстрый ответ, thx! Есть ли другой способ установить это вместо удаления ведущих 0? – NomeN

+0

Не то чтобы я знал. – Maulrus

2

В C нет синтаксиса двоичного числа, по крайней мере, без расширения компилятора. То, что вы видите, 010100 интерпретируется как восьмеричные (основание 8) номер: это делается, когда числовой литерал начинается с 0.

2

010100 рассматриваются как восьмеричные на C из ведущих 0. восьмеричного 10100 является 4160.

0

восьмеричной :-)

Вы можете найти these macros helpful для представления двоичных чисел с десятичными или восьмеричными числами в форме 1 и 0. Они обрабатывают ведущие нули, но, к сожалению, вам нужно выбрать правильное имя макроса в зависимости от того, есть ли у вас начальный нуль или нет. Не идеально, но, надеюсь, полезно.

Смежные вопросы