Collectives™ on Stack Overflow
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about Collectives
Teams
Q&A for work
Connect and share knowledge within a single location that is structured and easy to search.
Learn more about Teams
In C99, I include
stdint.h
and that gives me
UINT32_MAX
as well as
uint32_t
data type. However, in C++ the
UINT32_MAX
gets defined out. I can define
__STDC_LIMIT_MACROS
before including
stdint.h
, but this does not work if someone is including my header after already including
stdint.h
themselves.
So in C++, what is the standard way of finding out the maximum value representable in a
uint32_t
?
Not sure about
uint32_t
, but for fundamental types (
bool
,
char
,
signed char
,
unsigned char
,
wchar_t
,
short
,
unsigned short
,
int
,
unsigned int
,
long
,
unsigned long
,
float
,
double
and
long double
) you can use the
numeric_limits
templates via
#include <limits>
.
cout << "Minimum value for int: " << numeric_limits<int>::min() << endl;
cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;
If uint32_t
is a #define
of one of the above than this code should work out of the box
cout << "Maximum value for uint32_t: " << numeric_limits<uint32_t>::max() << endl;
–
–
Well, uint32_t will always be 32 bit, and always be unsigned, so you can safely define it manually:
#define UINT32_MAX (0xffffffff)
You can also do
#define UINT32_MAX ((uint32_t)-1)
–
–
–
I can't comment so here is my input on Glen vs Lior Kogan's answer.
If you are using static variables you will run into the problem that if you assign a constant value inside a class to numeric_limits::max() that value will be in fact set to zero because of the order of initialization (see this post zero initialization and static initialization of local scope static variable)
So in that case it will only work by using Lior Kogan's answer.
// This looks cleaner, less error prone and easier to read than the other suggested by Lior Kogan
#define UINT32_MAX ((uint32_t)-1)
You may be able to eliminate the #include
order problems by changing your build process to define the __STDC_LIMIT_MACROS
symbol on the compiler command line instead:
cxx -D__STDC_LIMIT_MACROS ...
Of course, you would still have trouble if a header #undef
s this symbol.
Also, the authors of the standard library implementation that you are using might not have intended for users to set that particular symbol; there might be a compiler flag or a different symbol that users are intended to use to enable C99 types in C++.
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.