Hello all,
In K&R2 one exercise asks the reader to compute and print the limits for
the basic integer types. This is trivial for unsigned types. But is it
possible for signed types without invoking undefined behaviour
triggered by overflow? Remember that the constants in limits.h cannot
be used. 88 3796
santosh wrote:
Hello all,
In K&R2 one exercise asks the reader to compute and print the limits for
the basic integer types. This is trivial for unsigned types. But is it
possible for signed types without invoking undefined behaviour
triggered by overflow? Remember that the constants in limits.h cannot
be used.
Isn't it possible to calculate this based on the unsigned types of the
same size?
--
Ian Collins.
Ian Collins wrote:
santosh wrote:
>Hello all,
In K&R2 one exercise asks the reader to compute and print the limits for the basic integer types. This is trivial for unsigned types. But is it possible for signed types without invoking undefined behaviour triggered by overflow? Remember that the constants in limits.h cannot be used.
Isn't it possible to calculate this based on the unsigned types of the
same size?
Won't this require knowledge of the encoding used, whether twos
complement or sign and magnitude etc?
On Wed, 12 Mar 2008 03:07:48 +0530, santosh wrote:
Hello all,
In K&R2 one exercise asks the reader to compute and print the limits for
the basic integer types. This is trivial for unsigned types. But is it
possible for signed types without invoking undefined behaviour triggered
by overflow? Remember that the constants in limits.h cannot be used.
#include <stdio.h>
int main(void) {
unsigned u = -1;
int i;
while ((i = u) < 0 || i != u)
u = u >1;
printf("INT_MAX == %u\n", u);
}
This is not guaranteed to work in C99, where the conversion of an out-of-
range integer may raise a signal, but it's valid C90, since the result of
the conversion must be a valid int, and therefore between INT_MIN and
INT_MAX.
santosh wrote:
Ian Collins wrote:
>santosh wrote:
>>Hello all,
In K&R2 one exercise asks the reader to compute and print the limits for the basic integer types. This is trivial for unsigned types. But is it possible for signed types without invoking undefined behaviour triggered by overflow? Remember that the constants in limits.h cannot be used.
Isn't it possible to calculate this based on the unsigned types of the same size?
Won't this require knowledge of the encoding used, whether twos
complement or sign and magnitude etc?
I think so, I should have added that.
--
Ian Collins.
santosh <santosh....@gm ail.comwrote:
In K&R2 one exercise asks the reader to compute and
print the limits for the basic integer types. This is
trivial for unsigned types. But is it possible for
signed types without invoking undefined behaviour
triggered by overflow? Remember that the constants
in limits.h cannot be used.
Yes. Unlike C99, unsigned to signed integer conversion
is implementation defined without the possibility of
raising a signal. So...
<http://groups.google.c om/group/comp.lang.c/msg/ffe17c645660b76 c>
INT_MIN isn't computed per se, rather it's derived by
determining the representation for negative ints. [I
know pete posted some very simple constant expressions,
though it was some time ago.]
--
Peter
Harald van D?k wrote:
On Wed, 12 Mar 2008 03:07:48 +0530, santosh wrote:
>Hello all,
In K&R2 one exercise asks the reader to compute and print the limits for the basic integer types. This is trivial for unsigned types. But is it possible for signed types without invoking undefined behaviour triggered by overflow? Remember that the constants in limits.h cannot be used.
#include <stdio.h>
int main(void) {
unsigned u = -1;
int i;
while ((i = u) < 0 || i != u)
u = u >1;
printf("INT_MAX == %u\n", u);
}
This is not guaranteed to work in C99, where the conversion of an
out-of- range integer may raise a signal, but it's valid C90, since
the result of the conversion must be a valid int, and therefore
between INT_MIN and INT_MAX.
Thanks. What about the minima?
Peter Nilsson wrote:
santosh <santosh....@gm ail.comwrote:
>In K&R2 one exercise asks the reader to compute and print the limits for the basic integer types. This is trivial for unsigned types. But is it possible for signed types without invoking undefined behaviour triggered by overflow? Remember that the constants in limits.h cannot be used.
Yes. Unlike C99, unsigned to signed integer conversion
is implementation defined without the possibility of
raising a signal. So...
<http://groups.google.c om/group/comp.lang.c/msg/ffe17c645660b76 c>
INT_MIN isn't computed per se, rather it's derived by
determining the representation for negative ints. [I
know pete posted some very simple constant expressions,
though it was some time ago.]
Would you say that this exercise is overly complex for that point in
K&R2?
On Wed, 12 Mar 2008 03:29:53 +0530, santosh wrote:
Harald van D?k wrote:
>On Wed, 12 Mar 2008 03:07:48 +0530, santosh wrote:
>>Hello all,
In K&R2 one exercise asks the reader to compute and print the limits for the basic integer types. This is trivial for unsigned types. But is it possible for signed types without invoking undefined behaviour triggered by overflow? Remember that the constants in limits.h cannot be used.
#include <stdio.h> int main(void) { unsigned u = -1; int i; while ((i = u) < 0 || i != u) u = u >1; printf("INT_MAX == %u\n", u); }
This is not guaranteed to work in C99, where the conversion of an out-of- range integer may raise a signal, but it's valid C90, since the result of the conversion must be a valid int, and therefore between INT_MIN and INT_MAX.
Thanks. What about the minima?
Up to INT_MIN, you can use this same idea, except start from LONG_MIN
instead of UINT_MAX. For LONG_MIN, I would cheat with
strtol("-999999999", 0, 0)
adding 9s until a range error is returned. :-)
Harald van D?k wrote:
On Wed, 12 Mar 2008 03:29:53 +0530, santosh wrote:
>Harald van D?k wrote:
>>On Wed, 12 Mar 2008 03:07:48 +0530, santosh wrote: Hello all,
In K&R2 one exercise asks the reader to compute and print the limits for the basic integer types. This is trivial for unsigned types. But is it possible for signed types without invoking undefined behaviour triggered by overflow? Remember that the constants in limits.h cannot be used.
#include <stdio.h> int main(void) { unsigned u = -1; int i; while ((i = u) < 0 || i != u) u = u >1; printf("INT_MAX == %u\n", u); }
This is not guaranteed to work in C99, where the conversion of an out-of- range integer may raise a signal, but it's valid C90, since the result of the conversion must be a valid int, and therefore between INT_MIN and INT_MAX.
Thanks. What about the minima?
Up to INT_MIN, you can use this same idea, except start from LONG_MIN
instead of UINT_MAX. For LONG_MIN, I would cheat with
strtol("-999999999", 0, 0)
adding 9s until a range error is returned. :-)
Okay. I for one am glad that limits.h exists. :-) This thread has been closed and replies have been disabled. Please start a new discussion. |