In limits.h
, there are #defines for INT_MAX
and INT_MIN
(and SHRT_* and LONG_* and so on), but only UINT_MAX
.
Should I define UINT_MIN
myself? Is 0
(positive zero) a portable value?
In limits.h
, there are #defines for INT_MAX
and INT_MIN
(and SHRT_* and LONG_* and so on), but only UINT_MAX
.
Should I define UINT_MIN
myself? Is 0
(positive zero) a portable value?
It's an unsigned integer - by definition its smallest possible value is 0. If you want some justification besides just common sense, the standard says:
6.2.6.2 Integer types
- For unsigned integer types other than
unsigned char
, the bits of the object representation shall be divided into two groups: value bits and padding bits (there need not be any of the latter). If there are N value bits, each bit shall represent a different power of 2 between 1 and 2^(N−1), so that objects of that type shall be capable of representing values from 0 to 2^(N−1) using a pure binary representation; this shall be known as the value representation. The values of any padding bits are unspecified.
You could use std::numeric_limits<unsigned int>::min()
.
If you want to be "typesafe" you could use 0U
, so if you use it in an expression you will have the correct promotions to unsigned
.