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?
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
.
#define UINT_MIN +0U
in limits.h
? –
Shook +
to the 0U
(why?) you should have the whole in parenthesis (+0U)
since otherwise you might have unwanted effects when the +
could be interpreted as addition. –
Fearsome 1+UINT_MIN
, it would expand to 1+ +0U
, which is a correct expression. Macro expansion happens at token level, and will not glue the two plusses together. –
Prevention 5 UINT_MIN
would become valid, where it really shouldn't. –
Fearsome sin UINT_MIN
becomes valid. –
Prevention +
in the first place? 0U
would be much simpler, then, and is really a well defined constant. –
Fearsome 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 2N−1, so that objects of that type shall be capable of representing values from 0 to 2N− 1 using a pure binary representation; this shall be known as the value representation. The values of any padding bits are unspecified.
2^(N-1)
should be (2^N)-1
instead e.g., for N=8
UCHAR_MAX = (2^8)-1 = 255
–
Smyrna 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
.
#define UINT_MIN +0U
in limits.h
? –
Shook +
to the 0U
(why?) you should have the whole in parenthesis (+0U)
since otherwise you might have unwanted effects when the +
could be interpreted as addition. –
Fearsome 1+UINT_MIN
, it would expand to 1+ +0U
, which is a correct expression. Macro expansion happens at token level, and will not glue the two plusses together. –
Prevention 5 UINT_MIN
would become valid, where it really shouldn't. –
Fearsome sin UINT_MIN
becomes valid. –
Prevention +
in the first place? 0U
would be much simpler, then, and is really a well defined constant. –
Fearsome © 2022 - 2024 — McMap. All rights reserved.