4

C99 標準の次の 2 つの条項に従って:

6.2.5-9

符号付き整数型の負でない値の範囲は、対応する符号なし整数型の部分範囲であり、各型の同じ値の表現は同じです。

6.2.6.2-2

符号付き整数型の場合、オブジェクト表現のビットは、値ビット、パディング ビット、符号ビットの 3 つのグループに分けられます。パディング ビットは必要ありません。正確に 1 つの符号ビットがあります。値ビットである各ビットは、対応する符号なし型のオブジェクト表現の同じビットと同じ値を持つものとします (符号付き型に M 個の値ビットがあり、符号なし型に N 個の値ビットがある場合、M ≤ N )。

符号付きの型が、対応する符号なしの型で表現可能なすべての数値を表すことは (おそらく) 可能です。たとえば、unsigned int型が 31 の値ビットと 1 つのパディング ビットを使用して表され、signed int が 31 の値ビットとパディング ビットなしで表されるとします。

実装はそうすることができますか? はいの場合、そのような場合unsigned intに an が an に昇格されることを意味しますかint(両方の型が同じ変換ランクを持ち、int表すすべての値をunsigned int表すことができるため)?

4

1 に答える 1

4

符号付きの型が、対応する符号なしの型で表現可能なすべての数値を表すことは (おそらく) 可能です。たとえば、unsigned int 型が 31 の値ビットと 1 つのパディング ビットを使用して表され、signed int が 31 の値ビットとパディング ビットなしで表されるとします。実装はそうすることができますか?

標準は次のように確立し6.3.1.8 Usual arithmetic conversionsます。

それ以外の場合、両方のオペランドで整数昇格が実行されます。次に、プロモートされたオペランドに次の規則が適用されます。両方のオペランドが同じ型である場合、それ以上の変換は必要ありません。

それ以外の場合、両方のオペランドが符号付き整数型であるか、または両方が符号なし整数型である場合、整数変換ランクが小さい型のオペランドは、ランクが大きいオペランドの型に変換されます。

それ以外の場合、符号なし整数型のオペランドのランクが他のオペランドの型のランク以上である場合、符号付き整数型のオペランドは符号なし整数型のオペランドの型に変換されます。

intunsigned 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)

于 2013-03-29T11:07:36.380 に答える