如何在C语言中将一个变量设置为最大可能的数?

23

在 C 语言中,你如何将一个变量设置为无穷大(或任何保证最大的数值)?


4
什么类型的变量?整型,浮点型等? - Andrew
3
我已经删除了C++标签,这个问题特别要求使用C语言,而在这种情况下,C++中惯用的做法与C不同(这里有一个回答涉及C++:https://dev59.com/pHE95IYBdhLWcg3wheRR#2274041)。 - David Rodríguez - dribeas
10个回答

34
#include <limits.h>
int x = INT_MAX;

编辑:在提问者澄清问题之前回答了,我只是猜测他们想要的类型。


1
谢谢接受,但我认为amo-ej1的答案更完整。 - dubiousjim

29

有一个名为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

8
请确保不要从这里复制粘贴数值,而是使用#include <limits.h>。该头文件是C89的一部分,因此它是完全可移植的。 - Tronic
与在线参考相同:http://www.utas.edu.au/infosys/info/documentation/C/CStdLib.html#limits.h - h0b0
1
值得注意的是,这个特定系统中INT_MIN的定义方式。他们不能将其定义为“-2147483648”,因为那意味着“负2147483648”,而2147483648会导致int溢出! - Alok Singhal
1
还有一个有趣的事情需要注意,就是在 INT_MAX 定义之前如何从 INT_MAX 推导出 INT_MIN。这一定是复制粘贴错误... - Jongware

12

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

无符号整数

unsigned int uMax = (unsigned int)~0;

带符号整数

signed int iMax = (unsigned int)~0 >> 1;

解释说明

  • ~0 -> 将所有位设置为1
  • >> 1 -> 通过将所有位向右移动一位来抹去符号位
  • (unsigned int) 在位反转后强制转换为无符号整数,而不是使用~0U,因为C语言中没有短整型和字符型字面量的后缀(通常指小于int的所有类型)

因此,对于最大可能的char值 - 只需在公式中更改类型转换为无符号字符等。

奖励 - 有符号整数的最小值

只需再次取反最大有符号整数表达式中的所有位即可:

signed int iMin = ~((unsigned int)~0 >> 1);

这将第一个标志位设为1,其余的位设为0


2
你的评论很有趣,能否请您解释一下您是如何得出这个解决方案的? - highlander141
我认为这绝对应该是最佳答案,我已经测试了uchar、ushort、uint、ulong甚至可变位长度变量,它们都填充了1。 - Mark Walsh
由于int类型默认是有符号的,所以您可以使用int iMax = (unsigned int)~0 >> 1;替代signed int iMax = (unsigned int)~0 >> 1;吗? - Mike Smith
@BobRobert 可能会起作用,只是一些示例是针对无符号整数的,所以我想让我的意图更清晰。顺便说一下,在 C89 标准中,位域声明可能存在一些微妙的差异。 - Agnius Vasiliauskas

9

迄今为止,获取无符号整数类型的最大值的最简单方法是将 (-1) 强制转换为该类型。标准 (§6.2.5/9) 要求对无符号数学进行模运算,模数是可以表示的最大值加一,因此对于任何无符号类型 T,表达式 ((T)-1) 必然是该类型中可能的最大值。


6
根据您的评论,您需要一个“unsigned int”(尽管您说“unsigned integer”,因此可能您需要一个整数值,而不一定是“unsigned int”)。
在C中,对于无符号整型,值“-1”在转换为该类型时保证是该类型的最大值:
size_t size_max = -1;
unsigned int uint_max = -1;
unsigned long ulong_max = -1;

将变量分别赋值为SIZE_MAXUINT_MAXULONG_MAX。通常情况下,应包含limits.h并使用适当的宏,但了解上述规则也是很好的。此外,SIZE_MAX不在C89中,因此size_t size_max = -1;在C89和C99中都可以使用。
请注意,只有无符号整数类型的溢出行为是有保证的。

1
是的,这对于你不想依赖宏定义的情况来说是很好的知识。但这是否是最佳编码实践呢?其他人可能会看着代码感到不确定是否存在错误(也许是由于粗心的修订)。使用宏有助于记录你的意图。 - dubiousjim
1
@profjim:就像我之前所说的,使用宏更好,但是如果你不能使用(例如C89 size_t),你应该使用“-1”。 - Alok Singhal

5

既然这个问题有C++标签,我建议使用numeric_limits:

#include <limits>

unsigned x = std::numeric_limits<unsigned>::max();

2
在任何人给我投反对票之前,请注意:此前有一个C++标签,但被David Rodríguez删除了。查看编辑历史,我发现它是由非原帖作者添加的。 - Fred Larson

2
通常可以通过1.0/0.0实现,但可能会出现编译警告。我不知道C89中的其他可移植方法,但是C99在math.h中有宏FP_INFINITE
编辑:显然Sam实际上并不想要无穷大,而是想要整数限制,这可以在limits.h中找到,就像其他人所说的那样。

哦,没想过查找类似math.h的东西。这肯定能行。谢谢!编辑:在我的情况下,limits.h更好用,抱歉让你感到困惑哈哈。 - Sam
1
1.0/0.0不具备可移植性,事实上,使用floatuint32_t联合体构建无限大比通过零除更具可移植性。 - R.. GitHub STOP HELPING ICE

1

1

我通常使用在limits.h中找到的*_MAX宏来处理整数等。这些将始终正确设置为变量类型。即使是明确大小的类型,例如uint32,在此标头文件中也将具有相应的条目。

这具有变量类型可以容纳的最大可能值的优点。

对于您在问题中提出的无符号整数,您将使用UINT_MAX


-1
  1. 首先,包含一个名为math.h的头文件。
  2. 现在,将INT_MAX赋值给您想要设置最大值的整数。 例如:# include<math.h> //需要包含的头文件// int a = INT_MAX; //假设“a”是您想要最大值的整数//

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接