gnu.gcc.help
[Top] [All Lists]

Re: What have I done wrong?

Subject: Re: What have I done wrong?
From: Pilcrow <pilcrow@xxxxxxx>
Date: Fri, 25 Jul 2008 22:30:41 -0700
Newsgroups: gnu.gcc.help

On Sat, 26 Jul 2008 02:17:58 +0100, Ben Bacarisse <ben.usenet@xxxxxxxxx>
wrote:

>Pilcrow <pilcrow@xxxxxxx> writes:
>
>> I have a fair understanding of perl, now I'm trying to learn C.
>> I'm trying to use long long, with trouble.  Here is demo code.
>> I'm using the gcc that came with strawberry perl.
>> Same output if I say %lld instead of %lli.  
>> Grateful for any help I can get.
>>
>> // demo.c
>> #include <stdio.h>
>> #include <limits.h>
>> int main()
>> {
>>      printf("%d\n",sizeof(long long));
>>      printf("%llu \n",ULLONG_MAX);
>>      printf("%lli \n",LLONG_MIN);
>>      printf("%lli \n",LLONG_MAX);
>>      printf("%lli to %lli \n",LLONG_MIN,LLONG_MAX);
>> }
>>
>> Here is the output.
>>
>> C:\>gcc --version
>> gcc (GCC) 3.4.5 (mingw special)
>> Copyright (C) 2004 Free Software Foundation, Inc.
>> This is free software; see the source for copying conditions.  There is
>> NO
>> warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
>> PURPOSE.
>>
>>
>> C:\>gcc -std=c99, -Wall demo.c
>>
>> C:\>a
>> 8
>> 4294967295
>> 0
>> -1
>> 0 to -2147483648
>>
>> C:\>
>
>That looks like a C99 compiler using a printf that is not long long
>aware.  Out of interest try this:
>
>#include <stdio.h>
>#include <limits.h>
>
>int main(void)
>{
>     char b[100];
>     snprintf(b, sizeof b, "%llu\n", ULLONG_MAX);
>     printf("%s", b);
>     printf("%d\n",sizeof(long long));
>     printf("%llu\n",ULLONG_MAX);
>}
>
>On my (later) version, I get:
>
>18446744073709551615
>8
>4294967295
>
>I think this is well-known issue with MS C library, but I may be
>misremembering that.  (Searches...) Ah, yes it is well known:
>
>http://www.mingw.org/MinGWiki/index.php/long%20long

Thank you so much.
I have to say $I64u instead of %llu in both cases:

#include <stdio.h>
#include <limits.h>

int main(void)
{
     char b[100];
     snprintf(b, sizeof b, "%I64u\n", ULLONG_MAX);
     printf("%s", b);
     printf("%d\n",sizeof(long long));
     printf("max unsigned long long: %I64u\n",ULLONG_MAX);
     printf("signed long long min: %I64d\n",LLONG_MIN);
     printf("signed long long max: %I64d\n",LLONG_MAX);
}

which gives me:

18446744073709551615
8
max unsigned long long: 18446744073709551615
signed long long min: -9223372036854775808
signed long long max: 9223372036854775807

I've definitely been spoiled by perl's great documentation.
Of course, m$ is guilty of obfuscation. They could have stuck
with the standard.

Thanks again


<Prev in Thread] Current Thread [Next in Thread>