2

質問があります。構造体でビット フィールドを使用するレガシー アプリケーションがあります。このようなもの

struct sample
{
    BYTE            one: 2; 
    BYTE            two     : 1;
    BYTE            three: 5;
} sampletest;

そのため、値は31 しかthree持てません。MAX

MAXここで、 の値を増やす必要がありますthree。ビットフィールドを削除する予定です。これで、より多くのメモリを処理できるようになります。この他に、何か気をつけることはありますか?それは他の害を引き起こしますか?

4

4 に答える 4

4

が符号なし型の場合BYTE、ビットフィールドは明確に定義されたオーバーフロー動作を持ちます - 例:

sampletest.one = -1;

3に設定さsampletest.oneれます。幅の広いタイプにすると、この動作が変わります。

于 2009-10-13T05:55:54.360 に答える
3

すべてのコードを注意深く調べて、ビット フィールドを含むこの構造体にコードが依存していないことを確認する必要があります。

たとえば、コードのどこかで、バイト全体が読み取られ、操作され、書き戻される可能性があります (キャストでは問題ありません)。ビット フィールドを削除すると、このコードはバラバラになります。したがって、キャストを探してください。キャストは、チェックするコードの指標です。

于 2009-10-13T05:16:43.360 に答える
0

宣言されているよう#define BYTE unsigned charに、ヘッダー ファイルのどこかにあると仮定すると、コンパイラがフィールドを適切にパックしている場合、構造体は 1 バイト分のスペースしか使用していません。コードが構造体内のフィールドにのみアクセスし、サイズが 1 バイトであると仮定して構造体全体をコピー/ゼロ化しようとしない場合 (たとえば、sizeof struct sampletest関与しない場合) は問題ありません。また、変更を行った後にシステムをテスト サイクルで実行することは言うまでもなく、コードを掘り下げてコードに触れたすべての場所を確認することも、かなり簡単なことです。

于 2012-01-27T23:15:13.070 に答える
0

あなたにとって重要かもしれないいくつかの追加事項があります。か否か。

C 言語では、ビット フィールドは 'int'、'signed int'、または 'unsigned int' (C99 では 'bool') としてのみ宣言できます。他の型は許可されていません (または、コンパイラが拡張機能として許可している場合は、移植できません)。(あなたの場合、「BYTE」の後ろに何が隠れているのだろうか。)

また、タイプ 'int' (明示的に 'signed' または 'unsigned' ではない) は、ビットフィールド宣言で使用される場合、実装 (および/またはそのコンパイル設定) に応じて、signed フィールドまたは unsigned フィールドのいずれかを宣言する可能性があります。

「three」を通常のフィールド (ビットファイルではない) に変換することを計画しているので、それが署名されているか署名されていないかを確認することは理にかなっているかもしれません。

于 2009-10-13T05:59:00.640 に答える