10

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?

Ariel Bold
  • 245
  • 2
  • 8

3 Answers3

20

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

  1. 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.
Carl Norum
  • 219,201
  • 40
  • 422
  • 469
7

You could use std::numeric_limits<unsigned int>::min().

Kirill V. Lyadvinsky
  • 97,037
  • 24
  • 136
  • 212
2

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.

Jens Gustedt
  • 76,821
  • 6
  • 102
  • 177
  • So I should `#define UINT_MIN +0U` in `limits.h`? – Ariel Bold Aug 18 '10 at 04:25
  • 1
    Thinking of it, it is perhaps not so a good idea to have a file that has the same name as a standard file or to mess around with the later. I'd put it another place. If you want to have a `+` 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. – Jens Gustedt Aug 18 '10 at 06:53
  • You don't need parenthesis. Even in `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. – MSalters Aug 18 '10 at 10:47
  • @MSalters: I think you need it since it makes invalid sequences valid. Something like `5 UINT_MIN` would become valid, where it really shouldn't. – Jens Gustedt Aug 18 '10 at 11:26
  • @Jens: Using that logic, I can equally say that you must _not_ have parenthesis as it makes invalid sequences valid. Something like `sin UINT_MIN` becomes valid. – MSalters Aug 18 '10 at 14:46
  • @MSalters: good point. So it is a matter of taste which invalid sequences should become valid ;-) Brings us back to the question, why using the `+` in the first place? `0U` would be much simpler, then, and is really a well defined constant. – Jens Gustedt Aug 18 '10 at 15:26
  • ++ for the pedantic type safety note; you tickled my humour :) – autistic Feb 22 '17 at 01:52