我正在尝试使用预处理器确定给定编译器的整数类型大小之间的关系。我的要求是我有两种类型,一种是无符号类型,另一种是有符号类型,能够存储所述无符号类型可以存储的每个正数。即我必须确保我的 ll_ssize
类型可以存储至少与 ll_usize
可以存储的一样多的正 和 负整数。
不幸的是,long long
与 long
和 int
的确切关系并未由 C 标准定义;在 some machines (例如 LP64 机器),long
的数据存储将完全等同于 long long
。
因此,我必须使用预处理器来尝试确定最大的可能类型,也有一个可用的更大类型;该类型的未签名版本变为 ll_usize
,而较大类型的签名版本变为 ll_ssize
。
这是我现在使用的代码:
#if defined(ULONG_MAX) && defined(LLONG_MIN) && defined(LLONG_MAX) && \
LLONG_MIN <= -(ULONG_MAX) && ULONG_MAX <= LLONG_MAX
typedef unsigned long int ll_usize;
typedef signed long long int ll_ssize;
#elif defined(UINT_MAX) && defined(LONG_MIN) && defined(LONG_MAX) && \
LONG_MIN <= -(UINT_MAX) && UINT_MAX <= LONG_MAX
typedef unsigned int ll_usize;
typedef signed long int ll_ssize;
#else
typedef signed int ll_usize;
typedef signed int ll_ssize;
#endif
现在,谈谈我的问题。我无法在预处理器表达式中进行强制转换,但似乎 ULONG_MAX
被错误地转换,因为我的编译器(clang
在 Mac OS 10.6 X Snow Leopard 上)吐出以下警告:
Source/Paws.o/Core/ll.h:21:15: warning: left side of operator converted from
negative value to unsigned: -9223372036854775808 to 9223372036854775808
LLONG_MIN <= -(ULONG_MAX) && ULONG_MAX <= LLONG_MAX
~~~~~~~~~ ^ ~~~~~~~~~~~~
有人知道我可以解决此转换错误的方法吗?或者,更好地解决整个问题,因为我真的不喜欢这些丑陋的预处理器表达式。
编辑:我还应该指出我为什么要这样做,而不是仅仅使用可用的最大有符号类型:我不想为所有这些负整数浪费内存空间,当我永远不会存储负数时。具体来说,无符号类型(ll_usize
)用于将索引存储到链表中;然而,一些对链表进行操作的函数可以采用负索引参数,并从链表的另一端开始工作:这些函数被声明为采用 ll_ssize
。浪费作为这些功能的参数是可以接受的;但是,系统中存储的实际列表上的索引不会浪费。
最佳答案
-(LLONG_MIN+1) > (ULONG_MAX-1)
怎么样?
关于c - 如何确定预处理器中 C 整数类型 MIN/MAXes 的关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2203819/