96 lines
4.2 KiB
Markdown
96 lines
4.2 KiB
Markdown
[conv.prom]
|
||
|
||
# 7 Expressions [[expr]](./#expr)
|
||
|
||
## 7.3 Standard conversions [[conv]](conv#prom)
|
||
|
||
### 7.3.7 Integral promotions [conv.prom]
|
||
|
||
[1](#1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L853)
|
||
|
||
For the purposes of [conv.prom],
|
||
a [*converted bit-field*](#def:bit-field,converted "7.3.7 Integral promotions [conv.prom]") is a prvalue that is the result of
|
||
an lvalue-to-rvalue conversion ([[conv.lval]](conv.lval "7.3.2 Lvalue-to-rvalue conversion")) applied to
|
||
a bit-field ([[class.bit]](class.bit "11.4.10 Bit-fields"))[.](#1.sentence-1)
|
||
|
||
[2](#2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L859)
|
||
|
||
A prvalue that is not a converted bit-field and has an integer type other thanbool, char8_t, char16_t,char32_t, or wchar_t whose integer conversion
|
||
rank ([[conv.rank]](conv.rank "6.9.6 Conversion ranks")) is less than the rank of int can be
|
||
converted to a prvalue of type int if int can represent
|
||
all the values of the source type; otherwise, the source prvalue can be
|
||
converted to a prvalue of type unsigned int[.](#2.sentence-1)
|
||
|
||
[3](#3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L869)
|
||
|
||
A prvalue of an unscoped enumeration type whose underlying type is not
|
||
fixed can be converted to a prvalue of the first of the following
|
||
types that can represent all the values of the enumeration ([[dcl.enum]](dcl.enum "9.8.1 Enumeration declarations")): int,unsigned int, long int, unsigned long int,long long int, or unsigned long long int[.](#3.sentence-1)
|
||
|
||
If none of the types in that
|
||
list can represent all the values of the enumeration, a prvalue of an unscoped
|
||
enumeration type can be converted to a prvalue of the extended integer type with lowest
|
||
integer conversion rank ([[conv.rank]](conv.rank "6.9.6 Conversion ranks")) greater than the rank of long long in which all the values of the enumeration can be represented[.](#3.sentence-2)
|
||
|
||
If there are
|
||
two such extended types, the signed one is chosen[.](#3.sentence-3)
|
||
|
||
[4](#4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L882)
|
||
|
||
A prvalue of an unscoped enumeration type whose underlying type is
|
||
fixed ([[dcl.enum]](dcl.enum "9.8.1 Enumeration declarations")) can be converted to a prvalue of its underlying type[.](#4.sentence-1)
|
||
|
||
Moreover,
|
||
if integral promotion can be applied to its underlying type, a prvalue of an unscoped
|
||
enumeration type whose underlying type is fixed can also be converted to a prvalue of
|
||
the promoted underlying type[.](#4.sentence-2)
|
||
|
||
[*Note [1](#note-1)*:
|
||
|
||
A converted bit-field of enumeration type is treated as
|
||
any other value of that type for promotion purposes[.](#4.sentence-3)
|
||
|
||
â *end note*]
|
||
|
||
[5](#5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L893)
|
||
|
||
A converted bit-field of integral type can be converted
|
||
to a prvalue of type int if int can represent all the
|
||
values of the bit-field; otherwise, it can be converted tounsigned int if unsigned int can represent all the
|
||
values of the bit-field[.](#5.sentence-1)
|
||
|
||
[6](#6)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L900)
|
||
|
||
A prvalue of typechar8_t, char16_t, char32_t, orwchar_t ([[basic.fundamental]](basic.fundamental "6.9.2 Fundamental types"))
|
||
(including a converted bit-field that was not
|
||
already promoted to int or unsigned int according to the rules above)
|
||
can be converted to a prvalue
|
||
of the first of the following types that can represent all the values of
|
||
its underlying type:int,unsigned int,long int,unsigned long int,long long int,unsigned long long int, or
|
||
its underlying type[.](#6.sentence-1)
|
||
|
||
[7](#7)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L921)
|
||
|
||
A prvalue of type bool can be converted to a prvalue of typeint, with false becoming zero and true becoming
|
||
one[.](#7.sentence-1)
|
||
|
||
[8](#8)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/expressions.tex#L927)
|
||
|
||
These conversions are called [*integral promotions*](#def:integral_promotion "7.3.7 Integral promotions [conv.prom]")[.](#8.sentence-1)
|