6

割り当てには2つのタスクがあり、1つは任意のマシンでint型のビット数を返します。私は自分の関数を次のように書くと思った:

int CountIntBitsF() {
    int x = sizeof(int) / 8;
    return x;
}

それは正しく見えますか?

2 番目の部分は、マクロを使用して任意のデータ型の任意のビット数を返すことであり、マクロは limits.h から取得できます。自分のマシンで limits.h とhttp://www.opengroup.org/onlinepubs/007908799/xsh/limits.h.htmlを調べましたが、それらのいずれかがどのように返されるかを本当に理解しているとは思いません任意のデータ型のビット数。何かご意見は?ありがとう。

4

7 に答える 7

16

ストレージの基本単位は charです。常に 8 ビット幅であるとは限りません。CHAR_BIT は limits.h で定義され、char のビット数を持ちます。

于 2010-01-19T03:14:10.260 に答える
9

*はありません/

2 番目の部分については、「数値制限」セクションを参照してください。

于 2010-01-19T02:58:12.230 に答える
3

ではlimits.h、UINT_MAX は unsigned int 型のオブジェクトの最大値です。これは、すべてのビットが 1 に設定された int であることを意味します。したがって、int のビット数を数えます。

#include <limits.h>

int intBits () {
    int x = INT_MAX;
    int count = 2; /* start from 1 + 1 because we assume
                    * that sign uses a single bit, which
                    * is a fairly reasonable assumption
                    */

    /* Keep shifting bits to the right until none is left.
     * We use divide instead of >> here since I personally
     * know some compilers which does not shift in zero as
     * the topmost bit
     */
    while (x = x/2) count++;

    return count;
}
于 2010-01-19T03:15:26.650 に答える
3

int をメモリに格納するために使用されるビット数が必要な場合は、ジャスティンの答えを使用してsizeof(int)*CHAR_BITください。値に使用されているビット数を知りたい場合は、slebetman の回答を使用してください。

INT のビットを取得するには、おそらく UINT_MAX ではなく INT_MAX を使用する必要があります。intC99が実際にとunsigned intが同じ幅であることを保証しているのか、それとも単に同じストレージサイズであることを保証しているのか思い出せません。6.2.6.2 では、「M = N または M = N-1」ではなく、「符号付きの型に M 値のビットがあり、符号なしの型に N の値のビットがある場合、M <= N」があるため、後者のみを疑っています。 .

実際には、整数型には、私が使用したどの実装でもパディング ビットがないため、ほとんどの場合、符号ビットに対して +/- 1 という同じ答えが得られます。

于 2010-01-19T03:28:10.443 に答える
2

g++ -O2 を使用すると、この関数はインライン定数に評価されます。

#include <climits>
#include <stddef.h>
#include <stdint.h>
#include <cstdio>

template <typename T>
size_t num_bits()
{
    return sizeof (T) * (CHAR_BIT);
}

int main()
{
    printf("uint8_t : %d\n", num_bits<uint8_t>());
    printf("size_t : %d\n", num_bits<size_t>());
    printf("long long : %d\n", num_bits<long long>());
    printf("void* : %d\n", num_bits<void*>());
    printf("bool : %d\n", num_bits<bool>());
    printf("float : %d\n", num_bits<float>());
    printf("double : %d\n", num_bits<double>());
    printf("long double : %d\n", num_bits<long double>());

    return 0;
}

出力:

uint8_t : 8
size_t : 32
long long : 64
void* : 32
bool : 8
float : 32
double : 64
long double : 96

生成された X86 32 ビット アセンバー:

- -をちょきちょきと切る - -

movl    $32, 8(%esp)      <--- const $32
movl    $.LC1, 4(%esp)
movl    $1, (%esp)
call    __printf_chk
movl    $64, 8(%esp)      <--- const $64
movl    $.LC2, 4(%esp)
movl    $1, (%esp)
call    __printf_chk

- -をちょきちょきと切る - -

于 2012-11-13T21:06:19.560 に答える
1

バイト数ではなく、ビット数が必要ですか? C では、特定の type について、演算子Tを使用して必要なバイト数を見つけることができます。sizeof1 バイトのビット数は でCHAR_BIT、通常は 8 ですが、異なる場合があります。

したがって、 type が指定Tされた場合、 type のオブジェクトのビット数は次のようになりますT

#include <limits.h>
size_t nbits = sizeof(T) * CHAR_BIT

typeを除いて、上記unsigned charのビットのすべての可能な組み合わせがnbitstype の有効な値を表すとは限らないことに注意してくださいT

sizeof2 番目の部分については、型だけでなくオブジェクトにも演算子を適用できることに注意してください。つまり、型Tとその型のオブジェクトxが与えられた場合:

T x;

T のサイズby sizeof(T)、およびby のサイズを見つけることができます。がオブジェクトに使用される場合、括弧はオプションです。xsizeof xsizeof

上記の情報があれば、2 番目の質問に答えることができるはずです。問題が解決しない場合は、再度質問してください。

于 2010-01-19T03:26:18.690 に答える