2015-05-26 3 views
2

вот код, который я нашел с помощью битового поля, напечатал int number в двоичном формате, но я также прочитал это поле бит только с использованием unsigned, int по его типу, так что это законно для этот код с использованием char типа? Правильный способ использования битового поля номер печати в двоичном формате

struct bits 
{ 
    unsigned char ch1 : 1;//01 
    unsigned char ch2 : 1; 
    unsigned char ch3 : 1; 
    unsigned char ch4 : 1; 
    unsigned char ch5 : 1; 
    unsigned char ch6 : 1; 
    unsigned char ch7 : 1; 
    unsigned char ch8 : 1; 
}; 

void main() 
{ 
    int data = -1; 
    int length = 4; 

    struct bits *p = &data; 

    while (length--) 
    { 
     printf("%d%d%d%d %d%d%d%d ", 
      (p + length)->ch8, 
      (p + length)->ch7, 
      (p + length)->ch6, 
      (p + length)->ch5, 
      (p + length)->ch4, 
      (p + length)->ch3, 
      (p + length)->ch2, 
      (p + length)->ch1 
      ); 
    } 
    system("pause"); 
} 

ответ

2

Битовое поле должно иметь тип, который является квалифицированной или неквалифицированной версией _Bool, signed int, unsigned int, или какими-либо другие реализацией определенных типов.

Использование unsigned char допускается с некоторыми компиляторами как «тип, определенный реализацией».

(p + length)->ch8 будет проходить обычный целых рекламных акций, являющихся параметрами вариационной функции. Таким образом, ch8 будет переведен в int, что соответствует "%d".

код может использовать unsigned

struct bits { 
    unsigned ch1 : 1;//01 
    unsigned ch2 : 1; 
    unsigned ch3 : 1; 
    unsigned ch4 : 1; 
    unsigned ch5 : 1; 
    unsigned ch6 : 1; 
    unsigned ch7 : 1; 
    unsigned ch8 : 1; 
}; 
+0

спасибо ваш ответ, но путем удаления 'char' только' unsigned' слева я получил неправильный выход 0000 0000 0000 0000 0000 0000 1111 1111 на моей Xcode – dispute

+0

@ v2pro Хотя этот вывод может быть не таким, как хотелось бы, это не «неправильно». Вместо использования кода типа 'struct bits * p = &data;' используйте 'union' из 4' struct bits', накладывающихся на 'uint32_t'. Ваш подход, как он есть, подразумевает неопределенное поведение. – chux

+0

Здесь действительно 3 вопроса: 1) Может ли 'unsigned char' разрешать бит-поле? 2) Является 'printf ("% d ... 'Правильный формат? 3) Является' struct bits * p = &data; 'OK. Это сообщение отвечает на первое 2. Последнее - неопределенное поведение. – chux

1

GCC является allowing любого целого типа, как битовое поле, в отличие от стандартов C99 и C11:

Допустимые типы битовое кроме _Bool, подписанная Int, и без знака INT (C99 и C11 6.7.2.1).
Другие целые типы, такие как long int и , перечислены типы разрешены даже в строго соответствующем режиме.