|
|
On Sat, 26 Jul 2008 08:27:49 -0700, Pilcrow <pilcrow@xxxxxxx> wrote:
>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?
Tried it, works exactly as you said, nested quotes and all. weird.
Oh, now I see. The compiler concatenates the quotes.
|
|