符号付きの型が、対応する符号なしの型で表現可能なすべての数値を表すことは (おそらく) 可能です。たとえば、unsigned int 型が 31 の値ビットと 1 つのパディング ビットを使用して表され、signed int が 31 の値ビットとパディング ビットなしで表されるとします。実装はそうすることができますか?
標準は次のように確立し6.3.1.8 Usual arithmetic conversions
ます。
それ以外の場合、両方のオペランドで整数昇格が実行されます。次に、プロモートされたオペランドに次の規則が適用されます。両方のオペランドが同じ型である場合、それ以上の変換は必要ありません。
それ以外の場合、両方のオペランドが符号付き整数型であるか、または両方が符号なし整数型である場合、整数変換ランクが小さい型のオペランドは、ランクが大きいオペランドの型に変換されます。
それ以外の場合、符号なし整数型のオペランドのランクが他のオペランドの型のランク以上である場合、符号付き整数型のオペランドは符号なし整数型のオペランドの型に変換されます。
int
とunsigned int
は同じランク ( 6.3.1.1 Boolean, characters, and integers
) であるため、int
は に変換されますunsigned int
が、その逆はありません。
— 符号なし整数型のランクは、対応する符号付き整数型がある場合、そのランクと等しくなければなりません。
のサフィックスが付いた整数定数u
は、常に符号なしです ( の表を参照6.4.4.1 Integer constants
)。
6.3.1.1 Boolean, characters, and integers
節 2 も次のように述べています。
以下は、int または unsigned int を使用できる式で使用できます。
— 整数変換ランクが int および unsigned int のランクよりも小さい整数型のオブジェクトまたは式。
— _Bool、int、signed int、または unsigned int 型のビットフィールド。
int が元の型のすべての値を表すことができる場合、値は int に変換されます。それ以外の場合は、unsigned int に変換されます。これらは整数プロモーションと呼ばれます。他のすべての型は、整数の昇格によって変更されません。
したがって、いいえ、キャストまたは代入によって明示的に要求しない限り、実装を合法的に に変換unsigned int
することはできません。int
EDIT : 句 2 は次の6.3.1.1 Boolean, characters, and integers
ように読み取ります。
— 整数変換ランクがint および unsigned int のランクよりも小さい整数型のオブジェクトまたは式。
(国際規格 ISO/IEC 9899 第 2 版 1999-12-01)
— 整数変換ランクがint および unsigned int のランク以下である整数型のオブジェクトまたは式。
(WG14/N1256 委員会草案 — 2007 年 9 月 7 日 ISO/IEC 9899:TC3)
—整数変換ランクがint および unsigned int のランク以下である整数型 ( int または unsigned int 以外)のオブジェクトまたは式。
(N1548 委員会草案 — 2010 年 12 月 2 日 ISO/IEC 9899:201x、
N1570 委員会草案 — 2011 年 4 月 12 日 ISO/IEC 9899:201x)
楽しみのために、C++11 の4.5 Integral promotions [conv.prom]
:
bool、char16_t、char32_t、または wchar_t 以外の整数型の prvalue で、整数変換ランク (4.13) が int のランクよりも小さいものは、int がソース型のすべての値を表すことができる場合、int 型の prvalue に変換できます。 ; それ以外の場合は、ソースの prvalue を unsigned int 型の prvalue に変換できます。
(N3242=11-0012、
N3337 日付: 2012-01-16、
国際規格 ISO/IEC 14882 第 3 版 2011-09-01)