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