Sunday, February 10, 2013

Invalid integer constants

Invalid integer constants:
So, another fun fact about C. You'd think that a language would
make it possible to express any value for its in-built types as a
simple constant expression. Of course, you can't do that in C.

In C you can express both signed and unsigned integer of any of the
integer types. For example 5 is a signed integer; 5L
is a signed long, 5U is an unsigned integer. But, there is no
way to expression a negative number as a constant! Despite what you might easily
assume, -5 is not constant, rather it is the unary -
operator applied to the constant 5. Now, generally this doesn't
cause any problems. Unless of course, you care about types and care about
having programs that are valid according to the standard.

So, assuming two's complement 32-bit integers, if you want an
expression that has the type int and the minimum value
(-2147483648), then you need to be careful. If you choose
the straight-forward approach you'd write this as
-2147483648, and you'd be wrong. Why? Well, the integer
constant 2147483648 has the type long, since
it can not be represented as an integer (the maximum value of a 32-bit
integer is 2147483647). So, the type of an expression of the form
- <long> is, of course long. So, what
can we do instead? Well, there are lots of approaches, but probably
the simplist is: -2147483647 - 1. In this case,
2147483647 can be represented as an integer,
-2147483647, is still of type int, and then
you can safely subtract 1.

Of course, this becomes even more interesting is you are dealing
with the type long long. Assuming a two's complement,
64-bit type, then the minimum value is
-9223372036854775808, but of course, you can't just write
-9223372036854775808LL, since
9223372036854775808LL can't be represented by the type
long long (and assuming the implementation doesn't define
any extended integer types), this would actually be an invalid C
program.

DIGITAL JUICE

No comments:

Post a Comment

Thank's!