The rank of longlongint is greater
than the rank of longint, which is greater than
the rank of int, which is greater than the rank of
shortint, which is greater than the rank of
signedchar.
The rank of any extended signed integer type relative to another
extended signed integer type with the same width is implementation-defined, but still subject to the other rules for determining the integer
conversion rank.
The integer conversion rank is used in the definition of the integral
promotions ([conv.prom]) and the usual arithmetic
conversions ([expr.arith.conv]).
The rank of a floating point type T is greater than
the rank of any floating-point type
whose set of values is a proper subset of the set of values of T.
An extended floating-point type with the same set of values as
exactly one cv-unqualified standard floating-point type
has a rank equal to the rank of that standard floating-point type.
An extended floating-point type with the same set of values as
more than one cv-unqualified standard floating-point type
has a rank equal to the rank of double.
The treatment of std::float64_t differs from
that of the analoguous _Float64 in C,
for example on platforms where all of
longdouble,
double, and
std::float64_t
have the same set of values (see ISO/IEC 9899:2024 H.4.2).
The conversion ranks of floating-point types T1 and T2
are unordered if the set of values of T1 is
neither a subset nor a superset of the set of values of T2.
This can happen when one type has both a larger range and a lower precision
than the other.
Floating-point types that have equal floating-point conversion ranks
are ordered by floating-point conversion subrank.
The subrank forms a total order among types with equal ranks.
The types
std::float16_t,
std::float32_t,
std::float64_t, and
std::float128_t ([stdfloat.syn])
have a greater conversion subrank than any standard floating-point type
with equal conversion rank.
Otherwise, the conversion subrank order is
implementation-defined.