web-dev-qa-db-ja.com

uint8、uint16、uint32のサイズは?

コードベースは、uint8 [1バイト幅の符号なし整数]、uint16 [2バイト幅の符号なし整数]、uint32 [4バイト幅の符号なし整数]などのデータ型を使用します。

質問:uint8はcharと同じですか?? uint16はintと同じですか?? uint32はlongと同じですか? uint64はdoubleと同じですか??

例:uint8 c [20]; //次に、sizeof(c)は20になりますか?以下に示すように、Visual Studioで小さなコードを作成しました。

#include <stdio.h>
#include <string.h>
typedef unsigned int uint32;
typedef unsigned int uint8;
int main()
{
    double a = 1320.134;
    uint32 b;
    uint8 c[20];
     b = (unsigned int)a;
    c[3] = b;
    printf("value is %d", c[3]);
    return 1;
}

しかし、デバッグモードでのcのサイズは50です。なぜそのように表示されるのですか??

11
user3458454

uint8uint16uint32、およびuint64は、おそらくMicrosoft固有のタイプです。

1999標準の時点で、Cは<stdint.h>uint8_tuint16_tuint32_t、およびuint64_tで定義されている同様の意味を持つ標準typedefをサポートしています。 Microsoft固有のタイプも同様に定義されていると仮定します。 Microsoftは少なくともVisual Studio 2010の時点で<stdint.h>をサポートしていますが、古いコードではuint8などを使用できます。

定義済みの型charshortintなどは、Cの実装ごとにサイズが異なります。 C標準には特定の最小要件があります(char少なくとも8ビット、shortおよびintは少なくとも16 longは少なくとも32であり、そのリスト内の各タイプは少なくとも前のタイプと同じ幅ですが、ある程度の柔軟性があります。たとえば、intが16、32、または64ビットのシステムを見てきました。

charalmost常に正確に8ビットですが、それより広くすることは許可されています。また、プレーンcharは、署名付きまたは署名なしのいずれかです。

uint8_tは、正確に8ビット幅の符号なし整数型である必要があります。 unsigned charのtypedefである可能性が高いですが、プレーンcharがたまたま署名されていない場合、プレーンcharのtypedefである可能性があります。事前定義された8ビットの符号なし型がない場合、uint8_tはまったく定義されません。

同様に、各uintN_tタイプは、正確にNビット幅の符号なしタイプです。

さらに、<stdint.h>は、対応する署名済みintN_t型と、少なくともであるint_fastN_tおよびint_leastN_t型を定義します指定された幅。

[u]intN_tタイプにはパディングビットがないことが保証されているため、それぞれのサイズは正確にNビットです。符号付きintN_tタイプは、2の補数表現を使用するために必要です。

uint32_tunsigned intと同じかもしれませんが、たとえばassumeとすべきではありません。少なくとも16ビット幅で、現在のシステムの「自然な」サイズの符号なし整数型が必要な場合は、unsigned intを使用します。正確に32ビット幅の符号なし整数型が必要な場合は、uint32_tを使用します。

(いいえ、uint64またはuint64_tdoubleと同じではありません; doubleは浮動小数点型です。)

16
Keith Thompson

サイズの計算方法(「デバッグモードのサイズ」?)はまったく不明です。

printf()を使用します。

printf("the size of c is %u\n", (unsigned int) sizeof c);

通常、size_tを使用して%zu値(sizeofが返す型)を出力しますが、Visual StudioなどのC99以前のコンパイラーを使用している場合は、作業。

コード内で、uint8などのカスタム名を定義するtypedefステートメントを見つける必要があります。これらは標準ではないため、ここでは誰がどのように定義されているかを知ることができませんコード内

新しいCコードは<stdint.h>を使用する必要があり、uint8_tなどが得られます。

3
unwind