Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在预处理器中确定C整数类型MIN/MAXes的关系?_C_Integer_C Preprocessor_Primitive Types - Fatal编程技术网

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

如何在预处理器中确定C整数类型MIN/MAXes的关系?,c,integer,c-preprocessor,primitive-types,C,Integer,C Preprocessor,Primitive Types,我试图使用预处理器确定给定编译器的整数类型大小之间的关系。我的要求是有两种类型,一种是无符号类型,另一种是有符号类型,能够存储无符号类型可以存储的所有正数。i、 e.我必须确保我的ll_usize类型能够存储的正整数和负整数至少与ll_usize类型能够存储的正整数和负整数相同 不幸的是,long-long和long和int的精确关系没有被C标准定义;在(如LP64机器)上,long的数据存储将完全等同于long 因此,我必须使用预处理器来尝试确定最大的可能类型,该类型也有一个较大的可用类型;该

我试图使用预处理器确定给定编译器的整数类型大小之间的关系。我的要求是有两种类型,一种是无符号类型,另一种是有符号类型,能够存储无符号类型可以存储的所有正数。i、 e.我必须确保我的
ll_usize
类型能够存储的正整数和负整数至少与
ll_usize
类型能够存储的正整数和负整数相同

不幸的是,
long-long
long
int
的精确关系没有被C标准定义;在(如LP64机器)上,
long
的数据存储将完全等同于
long

因此,我必须使用预处理器来尝试确定最大的可能类型,该类型也有一个较大的可用类型;该类型的未签名版本变为
ll\u-usize
,较大类型的签名版本变为
ll\u-usize

下面是我现在使用的代码:

#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
有人知道我解决这个转换错误的方法吗?或者,最好是对整个问题的更好的解决方案,因为我真的不喜欢这些丑陋的预处理器表达式


编辑:我还应该指出我为什么要这样做,而不仅仅是使用可用的最大有符号类型:我不想为所有这些负整数浪费内存空间,因为我永远不会存储负数。具体地说,无符号类型(
ll_usize
)用于链接列表中存储的索引;但是,某些在链表上操作的函数可以采用负索引参数,并从链表的另一端工作:这些函数被声明为采用
ll_ssize
。可以接受浪费作为这些函数的参数;但是,存储在系统中的实际列表上的索引的浪费情况并非如此。

那么
ULONG_MAX


忘记那些“小于或等于”的东西,你希望它严格小于。

那么
ULONG\u MAX



忘记那些“小于或等于”的东西,你希望它严格小于。

-(LLONG\u MIN+1)>(ULONG\u MAX-1)

-(LLONG\u MIN+1)>(ULONG\u MAX-1)
我没有任何解决方案,但是我可以告诉你,在大多数C预处理器中,你将很难做到-2^64。我没有仔细观察,以得出一个答案,但是,对无符号数使用一元运算符是没有意义的。它是无符号的,没有任何负值。编译器需要进行转换以保持其意义,这会使它呕吐。是的,这就是我试图解决的问题。我不能在预处理器中强制转换;因此,我需要某种方法使这个数学“合法”。显然,试图提供最大可用类型的负表示将是…#失败。我没有任何解决方案,但我可以告诉你,在大多数C预处理器中,要实现-2^64将是一件困难的事。我没有仔细观察,无法得出答案,但是,对无符号数使用一元运算符是没有意义的。它是无符号的,没有任何负值。编译器需要进行转换以保持其意义,这会使它呕吐。是的,这就是我试图解决的问题。我不能在预处理器中强制转换;因此,我需要某种方法使这个数学“合法”。显然,试图提供最大可用类型的负表示将是…#fail.Nah,它应该小于或等于:有符号类型可以存储(-UNSIGNED_type_MAX)和(+UNSIGNED_type_MAX)之间的所有内容,因为我需要能够对每个元素进行积极和消极的索引。我应该提到,这也不能消除转换错误。支持
ulong
为63位的系统真的很重要吗?这是针对很多很多平台的;我希望支持32位机器,可能是128位机器,以及极受限制的嵌入式应用程序等。除此之外,我只是想知道在这一点上正确的解决方案是什么:不,它应该小于或等于:有符号类型可以存储(-UNSIGNED_type_MAX)和(+UNSIGNED_type_MAX)之间的所有内容,因为我需要能够对每个元素进行正向和负向索引。我应该提到,这也不能消除转换错误。支持
ulong
为63位的系统真的很重要吗?这是针对很多很多平台的;我希望支持32位机器,可能是128位机器,以及极受限制的嵌入式应用程序等。最重要的是,我只是好奇在这一点上正确的解决方案是什么d-:嗯!这消除了警告,但我不确定我是否理解为什么他们两个都需要±1…因为如果LLONG_MIN上没有+1,那么LLONG_MIN>LLONG_MAX,那么-1就平衡了等式:)该死。这是一个天才的解决方案+1表示它合适,-1表示它再次有效。如果可以的话,我会给你不好的名声。d-:对于任何感兴趣的人来说,这完全解决了我的问题,而且也很优雅:这实际上只有在处理器使用2s补码存储int时才有效。我用过的一些DSP使用1s补码。嗯!这消除了警告,但我不确定我是否理解为什么他们两个都需要±1…因为如果LLONG_MIN上没有+1,那么LLONG_MIN>LLONG_MAX,那么-1就平衡了等式:)该死。这是一个天才的解决方案+1表示它合适,-1表示它再次有效。如果可以的话,我会给你不好的名声。d-:对于任何感兴趣的人来说,这完全解决了我的问题,而且也很优雅:这实际上只有在处理器使用2s补码存储int时才有效。一些DSP
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
    ~~~~~~~~~ ^  ~~~~~~~~~~~~