2016-10-25 8 views
0

96ではなく64で返されるのはなぜですか? ビットフィールドのI和ビットは、私が取得する場合には64編Cでのビットフィールドメモリの使用

var変数が0xFFFFFFない0xFFFFFFFFています。 。 - >var変数*

#include <stdio.h> 
#include <stdlib.h> 
#include <stdint.h> 

typedef struct{ 
    uint32_t a : 24; 
    uint32_t b : 20; 
    uint32_t c : 10; 
    uint32_t d : 6; 
    uint32_t e : 4; 
}MyType_t; 

int main(){ 
    MyType_t test; 
    test.a = -1; 
    test.b = -1; 
    test.c = -1; 
    test.d = -1; 
    test.e = -1; 

    uint64_t var = *((uint64_t*)&test); 

    printf("MyType_t: %d bit\n", sizeof(MyType_t) * 8);//96 bit 
    printf("Var: %#llX\n", var);//0x3FFFFFFF00FFFFFF 
    return 0; 
} 

0x3FFFFFFF00FFFFFFなく0xFFFFFFFFFFFFFFFFあり、このコードは正しく動作します:

typedef struct{ 
    uint32_t a : 16; 
    uint32_t b : 16; 
    uint32_t c : 16; 
    uint32_t d : 8; 
    uint32_t e : 8; 
}MyType_t; 
+0

'uint32_t'を' uint64_t'に変更すると、 'sizeof(MyType_t)'は '12'の代わりに' 8'を返します。 –

+0

@ WedeVane、どのような基準でそう言いますか?つまり、私は、あなたが言うことは実装によっては真実であることを疑うことはありませんが、私は標準の中にはそれが真実であることを必要としないと確信しています。特に、インプリメンテーションが(必須ではない)ビットを保持するためにuint32_t型のユニットを使用することを選択したとしても、ビットフィールドがそれらの記憶ユニットに分割されるかどうかはインプリメンテーション定義されます。 –

+0

@JohnBollingerは、64ビットの合計と32ビットにまたがるフィールドサイズが明らかなように見えたからです。投稿されたコードではいくつかの実装が成功するかもしれませんが、64ビットタイプの使用が成功しない可能性があります。 –

答えて

6

フィールドおよびbは、おそらくのuint32_tの単一型に収まらないことができます。

typedef struct{ 
    uint32_t a : 24; //first 32 bits 
    uint32_t b : 20; //second 32 bits 
    uint32_t c : 10; // 
    uint32_t d : 6;  //third 32 bits 
    uint32_t e : 4;  // 
}MyType_t; 

したがって、構造体のサイズはuint32_tの3倍です。


コードuint64_t var = *((uint64_t*)&test);の動作は定義されていません。

+0

ビットフィールドの再解釈に頼らえない理由の良い例... –

+0

'a'と' b'のどちらでも可能です単一の 'uint32_t'に適合させることは、ビットフィールドの宣言された型と、それが格納されているアドレス指定可能な記憶単位の大きさとの間には何の関連付けもしないので、実際に、この規格では、ビットを保持するための専用のアドレス可能な記憶装置内にビットフィールドがどのように配置されるかに関する要件はほとんどない。 –

+0

@JohnBollingerうん、私はOPの実装について前提を作っている。標準のその部分は非常に緩いです。 – 2501