2014-02-07 1 views
0

Я пытаюсь сделать это:Как объявить биты в C?

uint64_t key = 0110000010110110011001101111101000111111111010001011000110001110; 

не работает. GCC говорит

предупреждение: целочисленная константа слишком велик для своего типа

Любая идея, почему?

+1

Почему вы ожидаете, что компилятор C будет интерпретировать это как двоичное число? Я бы предложил [прочитать документы] (http://gcc.gnu.org/onlinedocs/gcc/Binary-constants.html). – larsks

+0

Это точное предупреждение будет зависеть от опции '-std = ' и других предупреждающих флагов. –

+0

Спасибо за это RTFM larsks. Но я попробую ELI5 вы действительно вопрос здесь: можете ли вы объявить биты без использования шестнадцатеричного. Надеюсь, кто-то умный написал ответ. –

ответ

6

Хотя ни draft C99 standard, ни поддержки draft C11 standard бинарные литералы, так как вы конкретно упомянуть gcc он имеет extension for binary literals, который говорит:

Целые константы могут быть записаны в виде двоичных констант, состоящая из последовательности «0» и цифры «1» с префиксом «0b» или «0B». Это особенно полезно в средах, которые много работают на уровне бит (например, микроконтроллерах).

они дает следующий пример (see it live):

я = 0b101010;

и это выглядит как clang также поддерживают это как an extension, а также (see it live):

[...] бинарные литералы (например, 0b10010) признаются. Clang поддерживает эту функцию как расширение во всех языковых режимах.

Это не доступно в стандартном C++ либо до C++14.

+0

Я бы не использовал его более нескольких бит, так как бит-строки стали нечитаемыми и подвержены ошибкам. – starblue

2

Из-за ведущего 0, который читается как очень большой восьмеричный литерал, который, вероятно, не тот, который вы хотите. Удивительно, C не имеет бинарных литералов.

В качестве расширения gcc поддерживает бинарные литералы с префиксом 0b, например, 0b101010. Если вы не хотите полагаться на расширения, шестнадцатеричная версия, вероятно, является наиболее разумной альтернативой.

0

Я думаю, это потому, что вы превысили максимальное целое число, которое может быть сохранено в виде данных uint. Попробуйте использовать массив булевых типов.

1

Использования Hex десятичных они более компактны и могут представлять собой бинарный пример:

0x01 // This is 0001 
0x02 // 0010 

Использования двоичным, как вы хотите особенно некрасиво внутри чей-то код.

Также, начиная число с 0 (в вашем примере) будет интерпретироваться как восьмеричное.

+0

это было только для целей тестирования –

1

Чтобы добавить @ ответ Шафик в:

#include <inttypes.h> 
#include <stdio.h> 

int main(void) 
{ 
    uint64_t i = UINT64_C(
     0b0110000010110110011001101111101000111111111010001011000110001110); 

    printf("%" PRIX64 "\n", i) ; 
    return 0; 
} 

работал с: gcc -std=gnu99 - выход: 60B666FA3FE8B18E

Действительно, встроенные системы являются гораздо более строгими о расширениях, особенно если вы достаточно неудачны быть необходимо придерживаться стандартов, таких как MISRA-C. Шестнадцатеричное преобразование - это просто группировка из 4 двоичных цифр в 0x0 -> 0xf.

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

  • Нет связанных вопросов^_^