5

STM32Fxcortex-M3シリーズプロセッサ用のプログラムを開発しています。stdint.hでは、以下が定義されています。

typedef unsigned int uint_fast32_t;
typedef uint32_t  uint_least32_t;
typedef unsigned long uint32_t;

私が理解しているように。

[u]int_fast[n]_t will give you the fastest data type of at least n bits.
[u]int_least[n]_t will give you the smallest data type of at least n bits.
[u]int[n]_t will give you the data type of exactly n bits.

また、私が知る限り、sizeof(unsigned int)<= sizeof(unsigned long)およびUINT_MAX<=ULONG_MAX-常に。

したがって、uint_fast32_tは、uint32_tのサイズ以上のサイズのデータ​​型であると予想されます。

cortex-M3の場合sizeof(unsigned int)== sizeof(unsigned long)== 4.したがって、上記の定義はサイズに関して「正しい」です。

しかし、なぜそれらは、基礎となるデータ型の名前と論理サイズと一致する方法で定義されていないのですか?

typedef unsigned long uint_fast32_t;
typedef unsigned int  uint_least32_t;
typedef uint_fast32_t uint32_t;

誰かが基礎となるタイプの選択を明確にできますか?

'long'と'int'が同じサイズであるとすると、3つの定義すべてに同じデータ型を使用しないのはなぜですか?

typedef unsigned int uint_fast32_t;
typedef unsigned int uint_least32_t;
typedef unsigned int uint32_t;
4

2 に答える 2

3

場合は、それが保証されているだけです

sizeof(long) >= sizeof(int)

そしてそれが実際にもはやあるという保証はありません。多くのシステムでは、intは通常同じくらいの長さです。

于 2012-07-08T08:35:04.350 に答える
2

あなたの他の質問に対する私の答えを見てください。

基本的に、どのタイプを使用するかは問題ではありません。intlongが同じサイズで、同じ表現と他の特性を持っていることを考えると、実装者はint32_tint_fast32_t、およびのいずれかのタイプを選択できint_least32_t、対応する無署名バージョンについても同様です。

(特定の選択は、 と のサイズが異なる実装に同じヘッダーを使用するという認識された必要性によって影響を受ける可能性がありますがintlong引用した特定の定義がそれをどのように達成するかわかりません。)

型が適切なサイズであり、標準によって課される他のすべての要件を満たしている限り、また、たとえば や との互換性に依存するコードを記述しない限り、int32_tそれは問題ではありません。intlong

行われた特定の選択は、実装者の恣意的な気まぐれである可能性が高く、これは完全に受け入れられます。あるいは、どちらのタイプが最適かについて異なる考えを持つ 2 人以上の開発者によって、そのヘッダー ファイルが変更された可能性があります。

于 2012-07-29T02:00:07.203 に答える