Sujet : Re: The difference between strtol() and strtoul() ?
De : Keith.S.Thompson+u (at) *nospam* gmail.com (Keith Thompson)
Groupes : comp.lang.cDate : 24. Jun 2024, 04:11:09
Autres entêtes
Organisation : None to speak of
Message-ID : <87ed8nt4qa.fsf@nosuchdomain.example.com>
References : 1 2 3 4 5 6 7 8 9 10 11 12 13
User-Agent : Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux)
Kaz Kylheku <
643-408-1753@kylheku.com> writes:
On 2024-06-23, Ben Bacarisse <ben@bsb.me.uk> wrote:
I don't want to pre-empt Tim's answer, but the wording that bothers me
is
>
"If the subject sequence begins with a minus sign, the value
resulting from the conversion is negated (in the return type)."
>
For strtoll("-9223372036854775808", 0, 0) the value resulting from the
conversion is 9223372036854775808 which can not even be represented in
the return type, so how can it be negated "in the return type"?
>
We have to trust that the specification wants the functions to perform
error checking, rather than precipitate into undefined behavior or
implementation-defined results.
>
If the negation, which is a positive value, cannot be represented in the
type, that implies it is out of range. The required behavior for a
positive out-of-range value is to return LLONG_MAX and set errno to
ERANGE.
>
The "in the return type" wording sounds like it may be written that way
to cover the unsigned case, strtoull.
>
I see in the N3220 draft that the signed and unsigned functions are
lumped together and the wording is now:
>
"If the subject sequence begins with a minus sign, the resulting value
is the negative of the converted value; for functions whose return type
is an unsigned integer type this action is performed in the return
type."
I should have checked the C23 draft before. I see that the wording has
been improved.
(Note that N3220 is actually an early draft of C26. The latest public
pre-C23 draft is N3149. The content should be very close; I don't
believe N3220 includes any post-C23 proposed changes.)
It's fairly clear that the "value" referred to in the quoted text is a
mathematical value, which might be outside the representable range of
any C type. The paragraph describing the returned value confirms this:
"If the correct value is outside the range of representable values ...".
So for strtoll("-9223372036854775808", NULL, 10) the "converted value"
of 9223372036854775808 exceeds LLONG_MAX, but that's ok. That value is
negated (mathematically) yielding -9223372036854775808, which is equal
to LLONG_MIN.
There's still some ambiguity for strtoull("-9999999999999999999", NULL,
10) (that's well outside the range of a 64-bit integer). For that to
work as expected, we have to assume that the determination that "the
correct value is outside the range of representable values" happens
*before* the negation "is performed in the return type". It's not clear
that this problem is worth fixing (doing so would likely make that
section longer and perhaps more confusing).
-- Keith Thompson (The_Other_Keith) Keith.S.Thompson+u@gmail.comvoid Void(void) { Void(); } /* The recursive call of the void */