1

C の関数について質問がありsizeofます。特定の型のビット サイズを取得する関数を書きたかったのです。私は初心者で、C の経験がほとんどないので、次の構造が必要かどうか疑問に思いました。入力タイプは何ですか?

int bits(  /*what TYPE goes here?*/ input  ) {
    return (8*sizeof( input ));
}

私の入力が直接 sizeof に渡されたことがわかるように、関数プロトタイプを正しく機能させるには、どの型を渡す必要がありますか?

4

4 に答える 4

5

C は静的に型付けされているため、型を関数に渡すことはできません。関数でこれを行う方法はありません。ただし、関数のようなマクロを使用すると機能します。

 #define bits(type) (8*sizeof(type))

 printf ("The type 'int' is %zu bits wide\n", bits(int));

用語集:sizeofは関数ではありません。演算子です。次のように、引数が式の場合は括弧なしで使用できます。

int i;
size_t j = sizeof i;

また、8 を掛けることは間違っている可能性があることにも注意してください。最近購入できるものは何でも安全な賭けですが、メモリがキロバイト (= 1024 :-) で測定されたとき、それが真実ではない奇妙な獣がいくつかありました. また、C 標準では、問題をさらに複雑にする可能性のあるパディング ビットについても言及されていますが、実際に見たことはありません。

于 2013-10-26T14:32:55.240 に答える
3

sizeof関数ではなく演算子です。さらに、実行時変数ではなく、コンパイル時定数として評価されます。型名または式のいずれかであるオペランドを取りますが、後者の場合、評価されるのは式の結果の型のサイズです。

サイズを 8 倍すると、ほとんどのプラットフォームでビット サイズが得られますが、すべてのプラットフォームに当てはまるわけではないことに注意してください (たとえば、TI TMS320C55x DSP は 16 ビットの char 型を持っています)。より安全な方法は、標準の limits.h ヘッダーで定義されている CHAR_BIT マクロを使用することです。

ビットサイズを評価するマクロを作成できます。

#include <limits.h>
#define bit_sizeof(t) (CHAR_BIT * sizeof(t) )

このマクロは、sizeof と同様に、型名または変数引数のいずれかを取ることができますが、これは関数ではできません。

于 2013-10-26T14:46:11.363 に答える
1

sizeof任意のデータ型のサイズを計算するために使用されます。やなどのプリミティブ データ型、intまたはなどのfloatユーザー定義データ型を渡すことができますstruct

于 2013-10-26T14:29:27.127 に答える
1

sizeofoperator は任意のデータ型に使用できますが、関数型またはビット フィールドの左辺値には使用できません。

任意の型 (プリミティブまたは関数で定義されたユーザー) を持つことができます

于 2013-10-26T14:32:46.753 に答える