1

次のことを想定しても安全ですか。

#if defined(_M_X64) || defined(_M_AMD64) || (defined(_M_IA64) && !defined(__itanuim__))
/* LLP64 Data Model */
#elif defined(__amd64__) || defined(__ia64__) || defined(__ia64) || defined(__itanuim__)
/* LP64 Data Model */
#else
/* 32-bits Data Model(s) */
#endif

Unix、BSD、Windows、Linux、HPの場合は?または私は完全に間違っています:-)または何かが欠けていますか?

ありがとう

4

1 に答える 1

0

インクルードファイルを介して利用できるCoが本当にない場合UINT_MAXは、少なくとも次のことを判断できますUINTMAX_MAX

typedef unsigned long long uintmax_t;
typedef signed long long intmax_t;

// start testing with the smaller values
#if -1U == 4294967295U
# define UINTMAX_MAX 4294967295
#elif -1U == 18446744073709551615U
...
#endif

プリプロセッサは、と同じ幅で計算しuintmax_tます。したがって、少なくともアーキテクチャのその部分を知っているはずです。

他のことについては、小さなインクルードファイルを作成するテストコードを記述します。

printf("#define CHAR_IS_SIGNED %d\n", ((char)-1 < 0));
printf("#define UCHAR_MAX %hhu\n", (unsigned char)-1);
printf("#define USHRT_MAX %hu\n", (unsigned short)-1);
printf("#define UINT_MAX %u\n", (unsigned)-1);
printf("#define ULONG_MAX %lu\n", (unsigned long)-1);
printf("#define ULLONG_MAX %llu\n", (unsigned long long)-1);

typedef妥当な仮定(2の補数、パディングビットなし)の下で、符号付きタイプの値を推測することができ、タイプに対して正しいことを行うこともできuintXX_tます。

于 2012-06-20T22:32:08.170 に答える