私は整数昇格の C99 規則と整数型の通常の算術変換に頭を悩ませようとしてきました。いくつかのニューロンを燃やした後、私は独自の一連のルールを思いつきました。これははるかに単純ですが、公式のものと同等であると私は信じています。
更新:この質問の目的のために、「物理タイプ」を次のように定義することから始めます
定義: 2 つの整数型は、サイズと符号が同じであれば、同じ物理型です。
この定義に何か問題があると思われる場合は、おそらく質問 2 の打撃に対する適切な答えが得られます。
簡素化されたプロモーション/コンバージョン ルール
型ランキング: 2 つの整数型 T1 と T2 の中で、「最高」は次のとおりです。
- どちらか大きい方
- サイズが同じ場合、符号のない方
- いずれにせよ物理的に同じであるため、サイズと署名が同じであれば、いずれかです。
積分昇格: 型 T の値を昇格する必要があります
昇格(T) = ベスト(T, int)
整数型の通常の算術変換: 型 T1 および T2 で二項演算子を評価する前に、引数を次の適切な共通型に変換する必要があります。
common(T1, T2) = best(T1, T2, int)
警告: 私のルールは正しい物理型を与えると信じていますが、単一の型が異なる名前を持つ場合、正しい型名を提供しない可能性があります。たとえば、システムでint==long
は、公式ルールは次のように述べています。
common(unsigned int, long) = unsigned long
一方、私のルールunsigned int
ではそうです(とにかく物理的に同じです)。しかし、名前はそれほど重要ではないので、これは問題にはなりません。それとも彼らはしますか?
この長い前奏曲の後、本当の質問が来ます。これには 2 つの要素があります。
質問 1: 私のルールは正しいですか?
公式のものを何度か読みましたが、それでもわかりにくいと思います。したがって、私は何かを誤解している可能性があります。私が間違っている場合は、公式ルールと私のルールで異なる型が生成される例を示してください。つまり、物理的に同じである異なるタイプだけでなく、異なる物理タイプです。
実世界の例が優先されます。何も見つからない場合、仮説的な C 環境が説得力のある十分な詳細 (関連する型のサイズなど) で記述されていれば、理論的な例で問題ありません。
ここで私が正しければ、2 番目の質問が適切になります。
質問 2: 昇格/変換された型の名前を気にする必要があるのはなぜですか?
もし私が正しければ、明白な疑問は「なぜ標準化委員会の人々はこれほど複雑なルールを書いたのか?」ということです。彼らは私が考えることができる唯一の答えは、プロモーション/変換によって生成された物理的なタイプだけでなく、それらのタイプに名前を付ける適切な方法も指定したかったということです. しかし、なぜ彼らは気にしたのですか?これらの型は、コンパイラによって内部的にのみ使用されます。それらが物理的に何であるかを理解している限り、どのように名前を付けるかは問題ではありません。この推論に何か問題がありますか? T1 と T2 が物理的に同じであるにも関わらず、T2 ではなく T1 に自動的に昇格または変換されるかどうかを知ることが重要である状況を考えられますか? 繰り返しになりますが、実世界の例が優先されますが、それ以外の場合は、十分に詳細な理論的な例で十分です。
根拠
(2014 年 11 月 10 日にいくつかのコメントに対応するためにセクションを追加)
これらのトピックを検索するとき、算術演算子の動作、より具体的にはそれらの演算子によって返される結果のコンテキストで議論されているのを常に見てきました。たとえば、-1L < 1U
long が int より実際に長いシステムでは true ですが、そうでない場合は false であるため、この式には問題があります。この種の問題を理解することは良いことだと思いますが、理解するために複雑なルールセットが必要になることは悪いことです。したがって、同じ結果を確実に与える、より単純なルールセットを構築するためのこの努力。
私は、私のルールが、実際のルールが十分に単純であると考える人にとって役に立たないことを十分に理解しています. 私はまた、公式ルール以外に頼ることは本質的に悪いという意見を表明する人々を理解しており、丁重に同意しません。それにもかかわらず、私のルールは、私以外の誰も助けない場合、その有用性を持っています.
私の個人的な偏見について: 物理学者として、私はシンプルさを非常に高く評価しています。私は、究極の真実ではない、あるいはそうであるように意図されていない理論を扱うことに慣れていますが、適用範囲の限界を理解している限り、それらは非常に有用であり、安全に使用できることが証明されています. どのような状況でも、最良の理論は最も完全なものではありません。それは、依然として適用可能な最も単純な理論です。たとえば、単純な振り子の周期を計算するために量子重力を使用することはありません。この質問をここに投稿するのは、上記の規則の適用範囲の限界について専門家の意見を得ようとする試みです。
これまでのところ、私が持っているものは次のとおりです。
- varargs ケース (tanks、mafso) は、これらのルールが少なくとも原則として適用されない C99 の唯一の状況のようです。
_Generic
キーワード (ありがとう、Pascal Cuoq) は、C11 の機能であるため、範囲外です。- C++11
auto
キーワード。これはさらに範囲外ですが、エイリアシング ルールに関する (そうでなければ無関係な) 懸念をテーブルにもたらすという点で興味深いものです。