如果你真的没有UINT_MAX
和 Co 可以通过包含文件获得,你至少可以确定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
对这些uintXX_t
类型进行正确处理。