本ページは公開が終了した情報の複製であり、掲載時点での情報です。本ページに記載されている内容について各所に問い合わせることはご遠慮下さい。
サポート技術情報

[MSC]long 型のビットフィールド演算が不正

文書番号: 402841

最終更新日: 2004/04/27


この資料は以下の製品について記述したものです。


概要

この資料は、long 型のビットフィールド演算が不正となる障害について説明したもの です。

詳細

Microsoft(R) 固有の仕様である long 型のビットフィールドにおいて、演算が正しく 行われない事があります。

再現プログラム

  #include <memory.h>
  #include <stdio.h>
  struct _TEST {
      unsigned long   W  : 6 ;
      unsigned long   A  : 6 ;
      unsigned long   B  : 6 ;
      unsigned long   C  : 6 ;
      unsigned long   D  : 6 ;
      unsigned long   dm1: 2 ;
  } test ;
  void main()
  {
      memset ( &test, 0, sizeof(test) ) ;
      test.W++ ;
      test.A++ ;
      test.B++ ;
      test.C++ ;
      test.D++ ;
      printf ( "%2d  %2d  %2d  %2d  %2d\n", (int)test.W,
      (int)test.A,(int)test.B, (int)test.C, (int)test.D );
  }

原因

コンパイラが生成するコードに問題があり、long 型の上位ワードのインクリメ
ントコードが抜け落ちているためです。

対処方法

C6.0 の場合、クイックコンパイルオプション (/qc) を使用しない限り、問題あり
ません。
C/C++7.0A の場合、高速コンパイルを抑制するオプション (/f-) を使用する事で、
回避できます。
論理演算やインラインアセンブラによりソースレベルでの対応も可能ですが、
フィールド幅や演算により処理が複雑になるため、お勧めできません。
この障害は Visual C++ 搭載のコンパイラでは修正されています。

詳細

  • Visual C++ は、米国 Microsoft Corporation の商標です。

Keywords: C6 C7 KBBUG VC10 KB402841
Technology: kbAudDeveloper kbCCompPDS600DOS kbCCompSearch kbVCsearch kbZNotKeyword3 kbZNotKeyword8

inserted by FC2 system