-1

std :: uint32_tを使用していますが、何らかの理由で、プラットフォーム(ARM Cortex M4 K20)のunsigned32であるunsignedlongとは異なるデータ型です...何かアイデアはありますか?

可変サイズの型が必要な場合があると思いますが、気にしないでください。

typedef unsigned short Integer16;
typedef std::uint32_t Integer32;

typedef unsigned int FastInteger16;
typedef unsigned long FastInteger32;

これに何か問題はありますか?

4

2 に答える 2

2

std::uint32_tは正確に 32 ビットで符号なし整数であると想定されています。

しかし、これは、unsigned intまたはになる可能性があることを意味しますunsigned long
これらの値は両方とも 32 ビット長になる可能性があります (実装によって異なります)。

または、std::uint32_t が 32 ビットでないかどうかを定義する方法を禁止して、条件付きで基本型を再定義できるようにしますか?

タイプstd::uint32_tは 32 ビットと定義されています。この型はオプションで定義され、プラットフォームに 32 ビットの符号なし整数型がない場合は使用できません。

于 2013-01-21T16:31:42.777 に答える
1

希望するコードは次のとおりです。

#if (typeid(std::uint32_t) == typeid(unsigned long))
    typedef unsigned long Integer32;
#else 
    typedef std::uint32_t Integer32;

それは合法ではありませんが、あなたが言おうとしているのは、言い換えれば、「をuint32_t意味する場合はunsigned longInteger32意味しunsigned longます。そうでなければ、それは何uint32_tを意味するかを意味します」ということです。

これは次と同等です:

typedef std::uint32_t Integer32;

どちらの場合もInteger32、意味する同じタイプをuint32_t意味するようにエイリアシングしているためです。だからそれを書いてください。

uint32_t準拠する実装では、 が符号なし 32 ビット型であることが保証されています。それunsigned longはあなたの実装にないので、ほぼ確実unsigned intです。これら 2 つの型unsigned longunsigned intは、同じサイズであっても異なる型です。対照的に、uint32_tは typedef であるため、typedef が意味するものと同じ型です。

新しい質問に答えるには:

typedef unsigned short Integer16;

unsigned short正確に 16 ビットではない可能性があります (ただし、そうでない実装はあまりありません)。正確な 16 ビットの符号なしタイプが必要な場合は、それuint16_tが目的です。これはオプションの型であるため、適切な型を持たない実装では、コードは有益なエラーになります。

typedef std::uint32_t Integer32;

uint32_tOK、オプションのタイプの警告付き。この名前Integer32を使用したい場合は、自由に使用してください。

typedef unsigned int FastInteger16;

少なくとも 16 ビットの高速符号なし整数が必要な場合std::uint_fast16_tは、ではなく使用します。unsigned int

typedef unsigned long FastInteger32;

少なくとも 32 ビットの高速符号なし整数が必要な場合std::uint_fast32_tは、ではなく使用します。unsigned long

于 2013-01-21T17:20:52.133 に答える