如何将变量设置为C中可能的最大数量?

Sam*_*Sam 20 c integer limits

如何在C中将变量设置为等于无穷大(或任何保证的最大数值)?

dub*_*jim 32

#include <limits.h>
int x = INT_MAX;
Run Code Online (Sandbox Code Playgroud)

编辑:在提问者澄清之前回答,我只是猜测他们想要什么类型.

  • 感谢limits.h实际上是我需要的 (4认同)

amo*_*ej1 27

有一个名为limits.h的文件(至少在Linux上有),它持有这种定义,例如

/* Maximum value an `unsigned short int' can hold.  (Minimum is 0.)  */
#  define USHRT_MAX 65535

/* Minimum and maximum values a `signed int' can hold.  */
#  define INT_MIN   (-INT_MAX - 1)
#  define INT_MAX   2147483647

/* Maximum value an `unsigned int' can hold.  (Minimum is 0.)  */
#  define UINT_MAX  4294967295U
Run Code Online (Sandbox Code Playgroud)

  • 请确保不要复制和粘贴此处的值,而是#include <limits.h>.标题是C89的一部分,因此它是完全可移植的. (8认同)

Jer*_*fin 9

到目前为止,获取无符号整数类型的最大值的最简单方法是将(-1)转换为该类型.标准(第6.2.5/9节)要求无符号数学以大于可以表示的最大值的数字模数执行,因此对于任何无符号类型T,表达式((T)-1)必然是该类型中可能的最大值.


Agn*_*kas 8

另一种获取整数最大值的可移植方法:

无符号整数

unsigned int uMax = (unsigned int)~0;
Run Code Online (Sandbox Code Playgroud)

有符号整数

signed int iMax = (unsigned int)~0 >> 1;
Run Code Online (Sandbox Code Playgroud)

说明

  • ~0 - >将所有位设置为1
  • >> 1 - >通过将所有位向右移位一个位置来擦除符号位
  • (unsigned int)在比特反转而不是使用后~0U,将类型转换为unsigned int ,因为C没有short的后缀,char文字(一般都比int小)

因此,对于最大可能的char值 - 只需将公式类型转换为unsigned char等.

额外奖励 - signed int的最小值

只需在max signed int expression中再次反转所有位:

signed int iMin = ~((unsigned int)~0 >> 1);
Run Code Online (Sandbox Code Playgroud)

这将第一个符号位设置为1,其余位设置为零

  • 您的评论很有意思,请您解释一下您是如何解决这个问题的? (2认同)

Alo*_*hal 6

根据你的评论,你想要一个unsigned int(虽然你说"无符号整数",所以也许你想要一个整数值,不一定是unsigned int).

在C中,对于无符号整数类型,-1当转换为该类型时,该值保证为该类型的最大值:

size_t size_max = -1;
unsigned int uint_max = -1;
unsigned long ulong_max = -1;
Run Code Online (Sandbox Code Playgroud)

分配值SIZE_MAX,UINT_MAXULONG_MAX分别的变量.通常,您应该包含limits.h并使用适当的宏,但很高兴知道上面的规则.此外,SIZE_MAX不是在C89,因此size_t size_max = -1;将在C89和C99中工作.

请注意,仅对无符号整数类型保证溢出行为.


Fre*_*son 5

由于这个问题有一个 C++ 标签,我建议使用 numeric_limits:

#include <limits>

unsigned x = std::numeric_limits<unsigned>::max();
Run Code Online (Sandbox Code Playgroud)

  • 在有人反对我之前,有一个 C++ 标签,直到被大卫罗德里格斯删除。查看编辑历史记录,我看到它是由 OP 以外的其他人添加的。 (2认同)