これは、標準では「通常の算術変換」と呼ばれ、同じ演算子のオペランドとして 2 つの異なる整数型が発生するたびに適用されます。
本質的には何ですか
- タイプの幅が異なる場合(より正確には、標準が変換ランクを呼び出すもの)、より広いタイプに変換されます
- 両方のタイプが同じ幅である場合、本当に奇妙なアーキテクチャに加えて、それらの署名されていないものが勝ちます
どのような型の値でも符号付きから符号なしへの変換では-1
、符号なし型の表現可能な最高値が常に得られます。
行 (1) の場合、結果は幅long
と幅によって異なりint
ます。int
が よりも狭い場合、long
すべてのunsigned
値が に収まるlong
ため、変換long
は RHS で で停止します。結果は「A」です。それらが同じ幅である場合、変換はunsigned long
両側に対して続行され、結果は "B" になります。
の特別なケースとして、 toよりも狭いすべての型を昇格させる「整数昇格short
」と呼ばれる機能もあります。3 行目と 4 行目では、LHS の式が最初に に変換され、値が変更されずに保持され、次に for (3)と for (4) が に変換されます。int
int
int
unsigned int
unsigned long
それによると、私のプラットフォーム(linux、gcc)はコードで「ADFH」を正しく出力します。
結果 "BDEH" は、最初に同じ幅の と を持ち、 の範囲でlong
カバーされる の範囲を持つプラットフォームで発生します。つまり、 の符号ビットを無視するだけです。そのようなプラットフォームがまだ存在することを知りませんでした。int
unsigned
int
unsigned
int
数年、私は整数型の解剖学に関するブログ記事を書きましたが、これはまだ有効なはずです。