How would you set a variable to the largest number possible in C?

て烟熏妆下的殇ゞ 提交于 2019-11-27 09:02:41
#include <limits.h>
int x = INT_MAX;

EDIT: answered before the questioner clarified, I was just guessing what type they wanted.

There is a file called limits.h (at least on Linux there is), which holds this kind of definition e.g.

/* 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

By far the simplest method to get the largest value for an unsigned integer type is to cast (-1) to that type. The standard (§6.2.5/9) requires that unsigned math be carried out modulo a number one greater than the largest value that can be represented, so for any unsigned type T, the expression ((T)-1) will necessarily be the largest value possible in that type.

Another portable way to get maximum value of integer:

Unsigned integer

unsigned int uMax = (unsigned int)~0;

Signed integer

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

Explanation

  • ~0 -> setting all bits to one
  • >> 1 -> erasing sign bit, by shifting all bits to the right by one position
  • (unsigned int) typecasting to unsigned int after bits inversion instead of using ~0U, because C doesn't have a suffix for short,char literals (everything smaller than int in general)

So for biggest possible char value - just change in formula typecasting to unsigned char and etc.

Bonus - minimum value of signed int

Simply just invert all bits once more in max signed int expression:

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

That sets first sign bit to one and the rest bits - to zero

Based upon your comments, you want an unsigned int (although you say "unsigned integer", so maybe you want an integral value, not necessarily an unsigned int).

In C, for unsigned integral type, the value -1, when converted to that type, is guaranteed to be largest value of that type:

size_t size_max = -1;
unsigned int uint_max = -1;
unsigned long ulong_max = -1;

assign the values SIZE_MAX, UINT_MAX and ULONG_MAX to the variables respectively. In general, you should include limits.h and use the appropriate macro, but it is nice to know the rule above. Also, SIZE_MAX is not in C89, so size_t size_max = -1; will work in C89 as well as C99.

Note that the overflow behavior is guaranteed only for unsigned integral types.

Since there's a C++ tag on this question, I'll suggest numeric_limits:

#include <limits>

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

Normally this is done by 1.0/0.0, but you may get a compile warning on that. I am not aware of other portable ways of doing it in C89, but C99 has macro FP_INFINITE in math.h.

EDIT: Apparently Sam didn't actually want infinity, but integer limits, which can be found in limits.h like others have stated.

I generally use the *_MAX macros found in limits.h INT_MAX for integers etc. These will always be correctly set for the variable type. Even the explicitly sized types such as uint32 will have corresponding entries in this header file.

This has the virtue of being the largest possible value that a variable of that type can hold.

For an unsigned integer as you asked for in your question, you would use UINT_MAX

thelinuxer

I guess you may want to check this link out:

http://www.gnu.org/s/libc/manual/html_node/Infinity-and-NaN.html

I did this and it works fine on gcc 4.4.1


#include "math.h"

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

  1. Firstly, include a header file named as math.h
  2. Now, equate INT_MAX to the integer whose value you want to set maximum. EXAMPLE:#include<math.h> //the header file which need to be included// int a=INT_MAX; //Suppose "a" be that integer whose value you want largest//
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!