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; 5Lis a signed long,
5U is an unsigned integer. But, there is noway 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'tcause 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 choosethe straight-forward approach you'd write this as
-2147483648, and you'd be wrong. Why? Well, the integerconstant
2147483648 has the type long, sinceit 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, whatcan 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 thenyou 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, since9223372036854775808LL can't be represented by the typelong long (and assuming the implementation doesn't defineany extended integer types), this would actually be an invalid C
program.
DIGITAL JUICE
No comments:
Post a Comment
Thank's!