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;
'uint32_t'を' uint64_t'に変更すると、 'sizeof(MyType_t)'は '12'の代わりに' 8'を返します。 –
@ WedeVane、どのような基準でそう言いますか?つまり、私は、あなたが言うことは実装によっては真実であることを疑うことはありませんが、私は標準の中にはそれが真実であることを必要としないと確信しています。特に、インプリメンテーションが(必須ではない)ビットを保持するためにuint32_t型のユニットを使用することを選択したとしても、ビットフィールドがそれらの記憶ユニットに分割されるかどうかはインプリメンテーション定義されます。 –
@JohnBollingerは、64ビットの合計と32ビットにまたがるフィールドサイズが明らかなように見えたからです。投稿されたコードではいくつかの実装が成功するかもしれませんが、64ビットタイプの使用が成功しない可能性があります。 –