2017-03-11 4 views
0

以下の構造体にビットフィールドのビット表現を出力したいとします。しかし、私が内容を印刷するとき、私はちょうど最初のビットフィールドの値を何度も何度も見続けています。私は間違って何をしていますか?Cの構造体に長さ8の複数のビットフィールドを出力する方法

#include <stdio.h> 
#include <limits.h> 

typedef struct Bits { 
    union BitUnion { 
     unsigned int op1 : 8; 
     unsigned int op2 : 8; 
     unsigned int op3 : 8; 
     unsigned int op4 : 8; 
     int num; 
    } BitUnion; 
} Bits; 

void printBitNum(Bits b); 

int main() { 
    Bits test; 
    test.BitUnion.op1 = 2; 
    test.BitUnion.op2 = 5; 
    test.BitUnion.op3 = 'd'; 
    test.BitUnion.op4 = 10; 
    printBitNum(test); 
    return 0; 
} 

void printBitNum(Bits b) { 
    int i; 
    for (i = (CHAR_BIT * sizeof(int)) - 1; i >= 0; i--) { 
     if (b.BitUnion.num & (1 << i)) { 
      printf("1"); 
     } else { 
      printf("0"); 
     } 
    } 
    printf("\n"); 
} 

答えて

1

unionは、すべてのメンバーが同じアドレスを共有することを意味します。したがって、op1,op2,op3およびop4はすべて同じ名前のメモリロケーションです。

コードでは、その場所が10に設定され、ほとんど初期化されていない変数が出力されます。

あなたは2つのメンバー:intと4つのビットフィールドを含む構造体を持つことを意味します。

+0

あなたはまさに正しいです!データ構造をunionホスティングに変更した後、 'struct'と' int'はすべて動作します。 – Yos

関連する問題