From owner-freebsd-questions@FreeBSD.ORG Wed Mar 3 08:18:46 2004 Return-Path: Delivered-To: freebsd-questions@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 4771F16A4CE for ; Wed, 3 Mar 2004 08:18:46 -0800 (PST) Received: from dan.emsphone.com (dan.emsphone.com [199.67.51.101]) by mx1.FreeBSD.org (Postfix) with ESMTP id 0700043D31 for ; Wed, 3 Mar 2004 08:18:46 -0800 (PST) (envelope-from dan@dan.emsphone.com) Received: (from dan@localhost) by dan.emsphone.com (8.12.10/8.12.10) id i23GIedB072566; Wed, 3 Mar 2004 10:18:40 -0600 (CST) (envelope-from dan) Date: Wed, 3 Mar 2004 10:18:40 -0600 From: Dan Nelson To: Wayne Sierke Message-ID: <20040303161840.GD79860@dan.emsphone.com> References: <1078286126.666.11.camel@ovirt.dyndns.ws> <20040303080359.GB79860@dan.emsphone.com> <1078304560.666.157.camel@ovirt.dyndns.ws> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1078304560.666.157.camel@ovirt.dyndns.ws> X-OS: FreeBSD 5.2-CURRENT X-message-flag: Outlook Error User-Agent: Mutt/1.5.6i cc: freebsd-questions@freebsd.org Subject: Re: Size of variables in awk X-BeenThere: freebsd-questions@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: User questions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 03 Mar 2004 16:18:46 -0000 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. -- Dan Nelson dnelson@allantgroup.com