Velocity Reviews > Direct computation of integer limits in K&R2?

# Direct computation of integer limits in K&R2?

santosh
Guest
Posts: n/a

 03-11-2008
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.

Ian Collins
Guest
Posts: n/a

 03-11-2008
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.

santosh
Guest
Posts: n/a

 03-11-2008
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?

Harald van Dĳk
Guest
Posts: n/a

 03-11-2008
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.

Ian Collins
Guest
Posts: n/a

 03-11-2008
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.

Peter Nilsson
Guest
Posts: n/a

 03-11-2008
santosh <(E-Mail Removed)> wrote:
> 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...

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

santosh
Guest
Posts: n/a

 03-11-2008
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.

santosh
Guest
Posts: n/a

 03-11-2008
Peter Nilsson wrote:

> santosh <(E-Mail Removed)> wrote:
>> 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...
>
>
> 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?

Harald van Dĳk
Guest
Posts: n/a

 03-11-2008
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.

santosh
Guest
Posts: n/a

 03-11-2008
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.