c - 如何确定预处理器中 C 整数类型 MIN/MAXes 的关系?

标签 c integer c-preprocessor primitive-types

我正在尝试使用预处理器确定给定编译器的整数类型大小之间的关系。我的要求是我有两种类型,一种是无符号类型,另一种是有符号类型,能够存储所述无符号类型可以存储的每个正数。即我必须确保我的 ll_ssize 类型可以存储至少与 ll_usize 可以存储的一样多的正 负整数。

不幸的是,long longlongint 的确切关系并未由 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/

相关文章:

hh :mm:ss. xxx 毫秒中的 C 程序时间戳和文件处理问题

c - 为什么一个程序的行为取决于它的 child 完成的顺序?

c++ - 将参数转换为整数,并进行错误检查

PHP字符串到整数玩得不好,编码问题?

c - 这个 "makes integer from pointer without a cast"在定义中安全吗?

级联预处理 :

c - 在C中修改二进制文件中的一些字节

c - c语言双向链表使用二级指针有什么好处?

python - 将数字分配给给定字符串的字母

用于粘贴标记的 C 宏