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

Re: What have I done wrong?

Subject: Re: What have I done wrong?
From: Pilcrow <pilcrow@xxxxxxx>
Date: Sat, 26 Jul 2008 08:27:49 -0700
Newsgroups: gnu.gcc.help

On Sat, 26 Jul 2008 12:11:24 +0100, Ben Bacarisse <ben.usenet@xxxxxxxxx>
wrote:

>Pilcrow <pilcrow@xxxxxxx> writes:
>
>> 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.
>
>Yes it is a shame they have not done it the C99 way (it must be
>trivial since the functionality is there).
>
>A tip:  If you have literal formats and want to this conditionally you
>can write:
>
>  printf("N = %"LL_MOD"d\n", ll_var);
>
>and
>
>#define LL_MOD "I64"
>
>when using mingw.

Not sure I understand all of that.  What is 'literal formats'?  I can
see that that idea would be handy for portability between m$ and linux,
but I'd probably have other problems in that case.  

Won't there be trouble with the nested quotes?


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