汎整数拡張とバランシングの違いは何ですか。演算(論理演算子&&、||、!を除く)を実行する前に、任意の型が少なくともint型またはunsigned int型に変換され、オペランドのいずれかがより大きい型の場合はより大きな型に変換されるということで、両方のルールを要約できますか? intより?
2 に答える
「統合プロモーション」は古いC90用語であり、正式な標準用語は整数プロモーションです。
整数拡張は、小さな整数型(bool、char、short、およびそれらに相当する符号付き)が式のオペランドとして使用される場合に適用されるルールです。
C11 6.3.1.1 / 4
intが元のタイプのすべての値を表すことができる場合(ビットフィールドの場合、幅によって制限されます)、値はintに変換されます。それ以外の場合は、unsignedintに変換されます。これらは整数プロモーションと呼ばれます。他のすべてのタイプは、整数プロモーションによって変更されません。
「バランシング」は、通常の算術変換と呼ばれる一連のルールを指す非公式の用語です。これらは、操作の各オペランドのすべての暗黙的な型昇格がどのように行われるかを示しています。整数プロモーションは通常の算術変換の一部であることに注意してください。
C11 6.3.1.8
まず、一方のオペランドの対応する実数型がlong doubleの場合、もう一方のオペランドは、型ドメインを変更せずに、対応する実数型がlongdoubleの型に変換されます。
それ以外の場合、いずれかのオペランドの対応する実数型がdoubleの場合、もう一方のオペランドは、型ドメインを変更せずに、対応する実数型がdoubleである型に変換されます。
それ以外の場合、いずれかのオペランドの対応する実数型がfloatの場合、もう一方のオペランドは、型ドメインを変更せずに、対応する実数型がfloatである型に変換されます。
それ以外の場合、整数拡張は両方のオペランドで実行されます。次に、プロモートされたオペランドに次のルールが適用されます。
両方のオペランドのタイプが同じである場合、それ以上の変換は必要ありません。
それ以外の場合、両方のオペランドが符号付き整数型であるか、両方が符号なし整数型である場合、整数変換ランクの低いタイプのオペランドは、ランクの高いオペランドのタイプに変換されます。
それ以外の場合、符号なし整数型のオペランドのランクが他のオペランドの型のランク以上の場合、符号付き整数型のオペランドは符号なし整数型のオペランドの型に変換されます。
それ以外の場合、符号付き整数型のオペランドの型が符号なし整数型のオペランドの型のすべての値を表すことができる場合、符号なし整数型のオペランドは符号付き整数型のオペランドの型に変換されます。
それ以外の場合は、両方のオペランドが、符号付き整数型のオペランドの型に対応する符号なし整数型に変換されます。
標準には2つの異なるものがありますが、バランシングと呼ばれるものはありません。
が元のタイプのすべての値を表すことができる場合
int
(ビットフィールドの場合、幅によって制限される)、値はint
;に変換されます。それ以外の場合は、に変換されますunsigned int
。これらは 整数プロモーションと呼ばれます。58)他のすべてのタイプは整数プロモーションによって変更されません。
...。
6.3.1.8通常の算術変換算術型のオペランドを期待する多くの演算子は、同様の方法で変換を引き起こし、結果型を生成します。目的は、オペランドと結果の共通の実数型を判別することです。
異なるタイプの式に適用される演算子の一般的な考え方は、オペランドが精度の低下が少ないタイプに変換されることです。たとえば、a
isfloat
とb
doubleの場合、合計は加算前にa + b
a
変換されます。最初にforに変換される場合もdouble
同様です。 c
unsigned long
double
c + b