On 11/19/14 11:03, Chen Gang wrote:
> On 11/19/14 0:44, Joseph Myers wrote:
>> On Sun, 16 Nov 2014, Chen Gang wrote:
>>
>>> The maximize 64-bits integer decimal string length excluding NUL is 20 (
>>> '-9223372036854775808'), so need use 20 instead of 18 for HOST_WIDE_INT.
>>>
>>> 2014-11-16 Chen Gang <[email protected]>
>>>
>>> * c-family/c-cppbuiltin.c (builtin_define_with_int_value): Use
>>> 20 instead of 18 for the maximize 64-bits integer decimal
>>> string length
>>
>> OK. (Though it's not a good idea to use builtin_define_with_int_value
>> with large arguments, as it won't generate any suffixes for arguments
>> outside the range of target int, and -9223372036854775808 would actually
>> need to be expressed as (-9223372036854775807LL-1). I think it's OK that
>> it doesn't parenthesize negative numbers when outputting them - that the
>> only cases for which the lack of parentheses could affect the parse are
>> invalid for other reasons - though parentheses around negative numbers
>> output might be a good idea anyway to make it obvious the output is OK,
>> and would accord with how some macros such as __*_MIN_EXP__ are output;
>> those values should probably use builtin_define_with_int_value.)
>>
>
> OK, thanks, what you said sounds reasonable to me. We need '(' and ')'
> for negative members, and "LL" for the members which is larger than 32
> bits.
>
> For me, for simplify thinking, can let all numbers have '(', ')' and
> "LL" (whether it is positive numbers or negative numbers, whether it is
> large numbers or small numbers), and one sprintf() is enough:
>
> sprintf(buf, "%s=("HOST_WIDE_INT_PRINT_DEC")LL", macro, value);
Oh, sorry, need be:
sprintf(buf, "%s=("HOST_WIDE_INT_PRINT_DEC"LL)", macro, value);
>
> And excuse me, I do not understand why use "(-9223372036854775807LL-1)"
> instead of "(-9223372036854775808LL)": compiler will report warning for
> it, but for me, it is more likely the compiler's own issue:
>
> bash-3.2# cat ./test.c
> #include <stdio.h>
>
> int main ()
> {
> long long i = (-9223372036854775808LL);
> long long j = 0x8000000000000000LL;
> long long k = 0x7fffffffffffffffLL;
>
> printf("\ni: %lld, j: %lld, k: %lld\n", i, j, k);
>
> return 0;
> }
> bash-3.2# gcc -o test test.c
> test.c:5:19: warning: integer constant is larger than the largest signed
> integer type
> long long i = (-9223372036854775808LL);
> ^
> 1 warning generated.
> bash-3.2# ./test
>
> i: -9223372036854775808, j: -9223372036854775808, k: 9223372036854775807
>
>
>
> Thanks
>
--
Chen Gang
Open, share, and attitude like air, water, and life which God blessed