ビットフィールドを符号付き/符号なしとして修飾することは意味がありますか?
10 に答える
標準 (ISO/IEC 9899:1999) の関連部分は 6.7.2.1 #4 です。
ビットフィールドは、_Bool、signed int、unsigned int、またはその他の実装定義型の修飾または非修飾バージョンである型を持つものとします。
はい。ここからの例:
struct {
/* field 4 bits wide */
unsigned field1 :4;
/*
* unnamed 3 bit field
* unnamed fields allow for padding
*/
unsigned :3;
/*
* one-bit field
* can only be 0 or -1 in two's complement!
*/
signed field2 :1;
/* align next field on a storage unit */
unsigned :0;
unsigned field3 :6;
}full_of_fields;
それがあなたのプロジェクトにとって意味があるかどうかは、あなただけが知っています。通常、フィールドが意味のある負の値になる可能性がある場合は、複数のビットを持つフィールドに対して行われます。
変数を符号付きまたは符号なしとして修飾することは非常に重要です。コンパイラは、比較およびキャスト中に変数を処理する方法を知る必要があります。このコードの出力を調べます。
#include <stdio.h>
typedef struct
{
signed s : 1;
unsigned u : 1;
} BitStruct;
int main(void)
{
BitStruct x;
x.s = 1;
x.u = 1;
printf("s: %d \t u: %d\r\n", x.s, x.u);
printf("s>0: %d \t u>0: %d\r\n", x.s > 0, x.u > 0);
return 0;
}
出力:
s: -1 u: 1
s>0: 0 u>0: 1
コンパイラは、1 または 0 の単一ビットを使用して変数を格納します。符号付き変数の場合、最上位ビットが符号を決定します (ハイは負として扱われます)。したがって、符号付き変数は、バイナリで 1 として格納されますが、負の 1 として解釈されます。
このトピックを拡張すると、符号なしの 2 ビット数の範囲は 0 から 3 であり、符号付きの 2 ビット数の範囲は -2 から 1 です。
Andrewがシングルビットビットフィールドについて話しているとは思いません。たとえば、4ビットフィールド:3ビットの数値情報、1ビットは符号用。これは完全に理にかなっていますが、頭の中でそのようなシナリオを思い付くことができないことは認めます。
更新:マルチビットビットフィールドの使用を考えることができないと言っているわけではありません(送信のためにデータを可能な限り圧縮するために2400bpsモデム時代にずっと使用してきました)が、私は考えることができません署名されたビットフィールドの使用法、特に読者にとって「あはは」の瞬間となるような趣のある明白なフィールドではありません。
最も確かに、ANSI-Cは符号付きおよび符号なしビットフィールドを提供します。必須です。これは、IEEE-754浮動小数点型[[1] [5] [10]]、[[1] [8] [23]]、および[[1][10][53]のデバッガーオーバーレイの作成の一部でもあります。 ]。これは、そのようなデータのマシンタイプまたはネットワーク変換、またはビデオカードテクスチャのようにリンクを介して送信する前に倍精度(数学の場合は64ビット)から半精度(圧縮の場合は16ビット)への変換をチェックする場合に役立ちます。
// Fields need to be reordered based on machine/compiler endian orientation
typedef union _DebugFloat {
float f;
unsigned long u;
struct _Fields {
signed s : 1;
unsigned e : 8;
unsigned m : 23;
} fields;
} DebugFloat;
エリック
はい、できます。C のビットフィールドは、基本的に範囲が限定された整数です。多くの場合、ハードウェア インターフェイスはビットを一緒にパックして、たとえば、-8 から 7 までの制御ができるようにします。この場合は符号付きビット フィールドが必要であり、0 から 15 までの場合は符号なしビットが必要です。分野。
符号付きビットフィールドが役立つ 1 つの場所は、エミュレートされたマシンのビット数がデフォルト ワードよりも少ないエミュレーションです。
私は現在、48ビットマシンのエミュレートを検討しており、ビットフィールドを介して64ビットの「ロングロング」から48ビットを使用することが合理的かどうかを調べています...生成されたコードは、すべてのマスキング、符号拡張などを明示的に行いましたが、はるかに読みやすくなります...
ビットマスキングの署名されたタイプは、シフトなどからのオーバーフローをどのように処理するかにより、プラットフォームハードウェアごとに異なります。
半分良いQAツールは、そのような使用法を故意に警告します。
このリファレンスによると、可能です:
http://publib.boulder.ibm.com/infocenter/macxhelp/v6v81/index.jsp?topic=/com.ibm.vacpp6m.doc/language/ref/clrc03defbitf.htm
'ビット'が符号付きの場合、範囲は-1、0、1であり、これが3進数になります。ここでは、その標準的な略語は適切ではないと思いますが、興味深い会話になります:)