コードベースは、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です。なぜそのように表示されるのですか??
uint8
、uint16
、uint32
、およびuint64
は、おそらくMicrosoft固有のタイプです。
1999標準の時点で、Cは<stdint.h>
:uint8_t
、uint16_t
、uint32_t
、およびuint64_t
で定義されている同様の意味を持つ標準typedefをサポートしています。 Microsoft固有のタイプも同様に定義されていると仮定します。 Microsoftは少なくともVisual Studio 2010の時点で<stdint.h>
をサポートしていますが、古いコードではuint8
などを使用できます。
定義済みの型char
、short
、int
などは、Cの実装ごとにサイズが異なります。 C標準には特定の最小要件があります(char
は少なくとも8ビット、short
およびint
は少なくとも16 long
は少なくとも32であり、そのリスト内の各タイプは少なくとも前のタイプと同じ幅ですが、ある程度の柔軟性があります。たとえば、int
が16、32、または64ビットのシステムを見てきました。
char
はalmost常に正確に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_t
はunsigned int
と同じかもしれませんが、たとえばassumeとすべきではありません。少なくとも16ビット幅で、現在のシステムの「自然な」サイズの符号なし整数型が必要な場合は、unsigned int
を使用します。正確に32ビット幅の符号なし整数型が必要な場合は、uint32_t
を使用します。
(いいえ、uint64
またはuint64_t
はdouble
と同じではありません; double
は浮動小数点型です。)
サイズの計算方法(「デバッグモードのサイズ」?)はまったく不明です。
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
などが得られます。