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

如何将变量设置为C中可能的最大数?,c,integer,limits,C,Integer,Limits,在C语言中,如何将变量设置为等于无穷大(或任何保证的最大数值)?有一个名为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

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

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

通常这是通过
1.0/0.0
完成的,但您可能会收到编译警告。我不知道在C89中还有其他可移植的方法,但C99在
math.h
中有宏
FP_INFINITE

编辑:显然,Sam实际上并不想要无穷大,而是整数限制,这可以在
limits.h中找到,就像其他人所说的那样。

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

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

我通常使用
限制中的*
\u MAX
宏。h
INT\u MAX
用于整数等。变量类型的设置总是正确的。即使是显式大小的类型,如uint32,也会在这个头文件中有相应的条目

它的优点是,它是该类型的变量所能容纳的最大可能值


对于您在问题中要求的无符号整数,您可以使用
UINT\u MAX

到目前为止,获取无符号整数类型最大值的最简单方法是将(-1)强制转换为该类型。标准(第6 2.5/ 9)要求无符号数学的模数大于可表示的最大值,因此对于任何未签名的类型<代码> t>代码>,表达式<代码>((t)-1)< /> >将是该类型中可能的最大值。

,因为在这个问题上有一个C++标记,我将建议数字限制:

#include <limits>

unsigned x = std::numeric_limits<unsigned>::max();
#包括
无符号x=std::numeric_limits::max();

我想您可能想查看此链接:

我这样做了,它在GCC4.4.1上运行良好


#include "math.h"

int main(int argc, char**argv)
{ 
    int x = INFINITY; 
    return 0;
}

根据您的注释,您需要一个
无符号int
(虽然您说的是“无符号整数”,所以您可能需要一个整数值,而不一定是
无符号int

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

size_t size_max = -1;
unsigned int uint_max = -1;
unsigned long ulong_max = -1;
分别为变量分配值
SIZE\u MAX
UINT\u MAX
ULONG\u MAX
。一般来说,您应该包括
limits.h
并使用适当的宏,但是了解上面的规则很好。而且,
SIZE\u MAX
不在C89中,因此
SIZE\t SIZE\u MAX=-1将在C89和C99中工作


请注意,溢出行为仅适用于无符号整数类型。

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

无符号整数 有符号整数 解释
  • ~0
    ->将所有位设置为一
  • >1
    ->通过将所有位向右移动一个位置来擦除符号位
  • (unsigned int)
    在位反转后将类型转换为unsigned int,而不是使用
    ~0U
    ,因为C没有短字符的后缀(通常小于int的所有字符)
因此,要获得最大可能的
char
值,只需将公式类型转换更改为 无符号字符等

红利-签名整数的最小值 只需在max signed int表达式中再次反转所有位:

signed int iMin = ~((unsigned int)~0 >> 1);
这将第一个符号位设置为1,其余位设置为0

  • 首先,包含名为math.h的头文件
  • 现在,将INT_MAX与要设置其最大值的整数相等。 示例:
    #包含//需要包含的头文件//
    int a=int_MAX//假设“a”是您希望其值最大的整数//
    

  • 什么样的变量?我删除了C++标签,问题是专门问C,在这个特殊的情况下,C++中的习惯用法与C方法不同(这里有C++的答案:)。这肯定会奏效的。谢谢编辑:limits.h在我的例子中工作得更好,很抱歉混淆lol
    1.0/0.0
    是不可移植的,事实上,使用与
    float
    uint32_t
    的并集构造无限位可能比用零除更可移植。请确保不要从这里复制和粘贴值,而是包含。标题是C89的一部分,因此它是完全可移植的。与在线参考相同:值得注意的是
    INT\u MIN
    是如何在这个特定系统上定义的。他们不能将其定义为
    -2147483648
    ,因为这意味着“负2147483648”,而2147483648会溢出
    int
    !另外值得注意的是,在定义INT_MAX之前,INT_MIN是如何从INT_MAX派生出来的。必须是一个复制粘贴错误…谢谢接受,但我认为AMO-EJ1的答案更完整。在任何人投票给我之前,有一个C++标签直到它被戴维RoDr Guez删除。查看编辑历史记录,我看到它是由OP以外的其他人添加的。是的,对于不希望依赖定义的宏的情况,知道这一点很好。但这是最好的编码实践吗?其他人可能会查看代码,不确定是否有错误(可能是由于粗心的修改)。使用宏有助于记录您的意图。@profjim:正如我所说,使用宏更好,但如果您不能(例如C89大小),您应该使用
    -1
    。您的评论很有趣,您能解释一下您是如何得出这个解决方案的吗?我想这肯定是最好的答案,我已经用uchar、ushort、uint、ulong进行了测试,甚至是可变位长度的变量,它们都用1s填充。由于int在默认情况下是有符号的,您能做
    intimax=(unsigned int)~0>>1
    而不是
    有符号整数iMax=(无符号整数)~0>>1?@BobRobert可能应该是
    
    signed int iMax = (unsigned int)~0 >> 1;
    
    signed int iMin = ~((unsigned int)~0 >> 1);