Size of variables in awk

Wayne Sierke ws+freebsd-questions at au.dyndns.ws
Wed Mar 3 09:15:52 PST 2004


On Thu, 2004-03-04 at 02:48, Dan Nelson wrote:
> In the last episode (Mar 03), Wayne Sierke said:
> > On Wed, 2004-03-03 at 18:34, Dan Nelson wrote:
> > > In the last episode (Mar 03), Wayne Sierke said:
> > > > It seems I've run into the 32-bit signed number wall in awk
> > > > (5.2-RELEASE).
> > > > 
> > > > My totals are maxing out at 2147483648.
> > > > 
> > > > Would anyone happen to know whether that's really the case (that awk is
> > > > only implemented with 32-bit number capability - unfortunately I don't
> > > > have any other awks nearby to verify nor can I find any reference info
> > > > that indicates) and/or can suggest a way around it?
> > > 
> > > Seems to works fine on -current:
> > > 
> > > $ jot 8 30 | awk '{ print 2^$1 }'
> > 
> > Ah, ok. Same for me on 5.2-RELEASE. More info:
> > 
> > I'm using the printf function in awk but something ain't right:
> > 
> > # jot 4 30 | awk '{ printf("%u\n", 2^$1-1) }'
> > 2147483648
> > 
> > # jot 4 30 | awk '{ printf("%lu\n", 2^$1-1) }'
> > 2147483648
> > 
> > # jot 4 30 | awk '{ printf("%llu\n", 2^$1-1) }'
> > 35186519572480
> 
> I see nothing wrong here.  %u is an unsigned int, and on x86 systems,
> an int is 32 bits.  %llu is a long long unsigned int, and they are 64
> bits.  Since there is no way for C to print a number larger than 64
> bits, you won't be able to use the numeric specifiers to print large
> numbers.  You can use %s though.  See
> /usr/src/contrib/one-true-awk/run.c, the format() function.

When you say "they are 64 bits" you're referring to a long
(signed/unsigned) int (not long long unsigned int)?

In which case aren't there two problems with the results shown?

1 - %u should print values up to 2^32-1

2 - %lu should print values up to 2^64-1

whereas they're both hitting a limit at 2^31.



More information about the freebsd-questions mailing list