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 <gang.chen.5...@gmail.com> >>> >>> * 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