0

次のコードを実行すると、奇妙な動作が見られます。構造体を使用してビットフィールドを作成します。52 ビットを使用したいので、long int を使用します。私のシステムでは long int のサイズは 64 ビットです。コード内で確認します。どういうわけか、1ビットを設定しようとすると、常に2ビットが設定されます。そのうちの 1 つは私が設定したかったもので、2 番目は最初のインデックスに 32 を加えたものです。

#include <stdio.h>

typedef struct foo {
  long int x:52;
  long int:12;
};

int main(){
  struct foo test;
  int index=0;
  printf("%ld\n",sizeof(test));
  while(index<64){
    if(test.x & (1<<index))
      printf("%i\n",index);
    index++;
  }
  test.x=1;
  index=0;
  while(index<64){
    if(test.x & (1<<index))
      printf("%i\n",index);
    index++;
  }
  return 0; 
}

Sryは出力を投稿するのを忘れていたので、私の質問は基本的に理解できませんでした...出力は次のとおりです。

8

0

32

4

2 に答える 2

5

indexはタイプintであり、システムではおそらく 32 ビットです。その型のビット数以上の量だけ値をシフトすると、未定義の動作になります。

(符号付きのビットシフト型はお勧めできません) に変更indexします。または、 、またはにunsigned long変更1<<indexすることもできます。1L << index1LL << index

他の人が指摘したように、初期化されていませんtest。次のようにすべてゼロに初期化できます。

 struct foo test = { 0 };

の正しいprintf形式size_t%zu、ではなく、%ldです。

longまた、 64 ビットという移植性のない仮定に依存しないように、コードを変更することは悪い考えではありません。32 ビットまで狭くすることができます。uint_N_tで定義されている型の使用を検討してください<stdint.h>

intまた、 、unsigned intsigned int、および_Bool(または)以外の型のビット フィールドboolは実装定義であることにも言及する必要があります。

于 2013-07-01T19:07:56.430 に答える
1

text.x構造体を初期化せずにビットをチェックインすると、コードで未定義の動作が発生します。変数を初期化しないため、ランダム データが含まれます。

于 2013-07-01T19:03:50.767 に答える