[FFmpeg-devel] [PATCH] Implement the function cmdutils.c:parse_int_or_die
Måns Rullgård
mans
Wed Feb 20 19:12:00 CET 2008
D. Hugh Redelmeier wrote:
> From: Michael Niedermayer <michaelni at gmx.at>
>
> On Wed, Feb 20, 2008 at 01:43:19PM -0000, M?ns Rullg?rd wrote:
>
>> Michael Niedermayer wrote:
>> > On Wed, Feb 20, 2008 at 01:51:22AM -0500, D. Hugh Redelmeier wrote:
>> >> Sure, but I claim that any values of type int or int64_t will of
>> >> necessity (by way of guarantees in the C standard) be within the range
>> >> [LLONG_MIN, LLONG_MAX].
>> >
>> > That is not true. Quoting the C spec:
>> > --------
>> > minimum value for an object of type long long int
>> > -9223372036854775807 // -(2^63 - 1)
>> > LLONG_MIN
>>
>> You missed the part that says of these values:
>>
>> Their implementation-defined values shall be equal or greater in
>> magnitude (absolute value) to those shown, with the same sign.
>>
>> It is perfectly legal for long long to be wider than 64 bits, but it
>> must be at least 64 bits.
>
> yes but it does not need to support
> -9223372036854775808
> while
> int64_t must support it
>
> You are quite right. I had forgotten this.
>
> The C standard has traditionally allowed signed binary numbers to be
> in one's or two's complement or sign magnitude form. Reluctantly:
> almost everyone used two's complement and a lot of real C code assumes
> two's complement.
C99 allows any of those three forms of signed integers.
> When <stdint.h> was added, an implementation was allowed (not
> required) to define exact-width integer types. For those types, the
> standard mandates two's complement. The expectation is that if a
> system does not use two's complement it would not define these types.
I don't see anything in the standard explicitly mandating two's complement
for these types, but it's probably the only possible implementation
consistent with the range requirements.
> (To be more accurate, I should point out that a C99 implementation that
> uses two's complement, without padding, for integral types, and has
> integral types of 8, 16, 32, or 64 bits, must define the corresponding
> intN_t and uintN_t typedef names. 7.18.1.1)
>
> If you assume that int64_t exists (as ffmpeg does) then I think that
> you are safe in assuming that the machine uses two's complement and
> thus long long can hold any int64_t value.
The standard requires [u]intmax_t, which must be capable of representing
any value of any [unsigned] integer type.
There are also the [u]int_leastN_t types, which are required, even
the 64-bit versions. The ranges of these permit either of the sign
representations, however.
--
M?ns Rullg?rd
mans at mansr.com
More information about the ffmpeg-devel
mailing list