Значение C определяют изменения неожиданно - PullRequest
6 голосов
/ 19 апреля 2010

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

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

#define _ImmSign    010100

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

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

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

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

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

Ответы [ 7 ]

13 голосов
/ 19 апреля 2010

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

Удалите ведущий ноль, и вы должны быть в порядке.

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

4 голосов
/ 19 апреля 2010

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

2 голосов
/ 19 апреля 2010

Проверьте, у него есть несколько макросов для использования двоичных чисел в C http://www.velocityreviews.com/forums/t318127-using-binary-numbers-in-c.html

Существует еще одна тема, которая имеет это также Могу ли я использовать двоичный литерал в C или C ++?

2 голосов
/ 19 апреля 2010

010100 рассматривается как восьмеричная буквой C из-за ведущего 0. Октал 10100 равен 4160.

2 голосов
/ 19 апреля 2010

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

1 голос
/ 19 апреля 2010

Если вы хотите написать непереносимый код и использовать gcc, вы можете использовать расширение двоичных констант :

#define _ImmSign    0b010100
0 голосов
/ 19 апреля 2010

Октал: -)

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

...