Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   C Programming (http://www.velocityreviews.com/forums/f42-c-programming.html)
-   -   Direct computation of integer limits in K&R2? (http://www.velocityreviews.com/forums/t597867-direct-computation-of-integer-limits-in-k-and-r2.html)

 santosh 03-11-2008 09:37 PM

Direct computation of integer limits in K&R2?

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 03-11-2008 09:44 PM

Re: Direct computation of integer limits in K&R2?

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 03-11-2008 09:50 PM

Re: Direct computation of integer limits in K&R2?

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 03-11-2008 09:54 PM

Re: Direct computation of integer limits in K&R2?

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 03-11-2008 09:54 PM

Re: Direct computation of integer limits in K&R2?

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 03-11-2008 09:56 PM

Re: Direct computation of integer limits in K&R2?

santosh <santosh....@gmail.com> 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 03-11-2008 09:59 PM

Re: Direct computation of integer limits in K&R2?

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 03-11-2008 10:01 PM

Re: Direct computation of integer limits in K&R2?

Peter Nilsson wrote:

> santosh <santosh....@gmail.com> 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 03-11-2008 10:21 PM

Re: Direct computation of integer limits 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. :-)

 santosh 03-11-2008 10:30 PM

Re: Direct computation of integer limits in K&R2?

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. :-)

All times are GMT. The time now is 02:42 PM.