Битовые поля в C ++ - PullRequest
       5

Битовые поля в C ++

4 голосов
/ 07 августа 2010

У меня есть следующий код для самообучения:

#include <iostream>
using namespace std;
struct bitfields{
    unsigned field1: 3;
    unsigned field2: 4;
    unsigned int k:  4;
};

int main(){
    bitfields field;
    field.field1=8;
    field.field2=1e7;
    field.k=18;
    cout<<field.k<<endl;
    cout<<field.field1<<endl;
    cout<<field.field2<<endl;
    return 0;
}

Я знаю, что unsigned int k:4 означает, что k имеет ширину 4 бита или максимальное значение 15, и в результате получается следующее.

2
0
1

Например, filed1 может быть от 0 до 7 (в комплекте), field2 и k от 0 до 15. Почему такой результат?Может быть, все должно быть нулевым?

Ответы [ 3 ]

9 голосов
/ 07 августа 2010

Вы переполняете свои поля.Давайте возьмем k в качестве примера, его ширина 4 бита.Он может содержать значения, как вы говорите, от 0 до 15, в двоичном представлении это

0  -> 0000
1  -> 0001
2  -> 0010
3  -> 0011
...
14 -> 1110
15 -> 1111

Поэтому, когда вы назначаете 18, двоичное представление

18 -> 1 0010 (space added between 4th and 5th bit for clarity)

kудерживайте только младшие четыре бита, поэтому

k = 0010 = 2.

Эквивалент сохраняется и для остальных ваших полей.

4 голосов
/ 07 августа 2010

У вас есть эти результаты, потому что назначения переполнили каждое битовое поле.

Переменная filed1 имеет значение 3 бита, но для представления 8 требуется 4 бита (1000). Все три младших бита равны нулю, поэтому filed1 равно нулю.

Для filed2 17 представлено 10001, но filed2 - это только четыре бита. Младшие четыре бита представляют значение 1.

Наконец, для k 18 представлено 10010, но k - это только четыре бита. Младшие четыре бита представляют значение 2.

Надеюсь, это поможет прояснить ситуацию.

1 голос
/ 07 августа 2010

В C ++ любой тип без знака оборачивается, когда вы достигаете потолка [1].Когда вы определяете битовое поле из 4 битов, то каждое значение, которое вы сохраняете, также оборачивается.Возможные значения для битового поля размера 4 - 0-15.Если вы сохраняете «17», то переходите к «1», для «18» вы переходите еще на «2».

Математически, обернутое значение является исходным значением по модулю возможные значения для типа назначения:

для битового поля размера 4 (2 ** 4 возможных значения):

18 % 16 == 2
17 % 16 == 1

для битового поля размера 3 (2 **3 возможных значения):

8 % 8 == 0.

[1] Это не относится к типам со знаком , когда неизвестно, что произойдет.

...