2

k&RCから

  • まず、一方のオペランドがlong doubleの場合、もう一方はlongdoubleに変換されます。
  • それ以外の場合、一方のオペランドがdoubleの場合、もう一方はdoubleに変換されます。
  • それ以外の場合、一方のオペランドがfloatの場合、もう一方はfloatに変換されます。
  • それ以外の場合、積分昇格は両方のオペランドで実行されます。..。

これは以下の表現を意味します

char a,b,c;

c=a+b;

実際には次のように計算されます

c = char((int)a+(int)b);

このルールの背後にある理論的根拠は何ですか?

これらの変換は、a、b、およびcが短い場合に発生しますか?

4

3 に答える 3

4

いいえ、それは実際には真実ではありません。C99セクション5.1.2.3 Program execution、条項10は、あなたが尋ねるケースを正確にカバーしています。

例2
フラグメントを実行する際
char c1, c2;
c1 = c1 + c2;
、「整数拡張」では、抽象マシンが各変数の値をintサイズに昇格させてから、2つのintを加算し、合計を切り捨てる必要があります。

2つの文字の追加をオーバーフローなしで実行できる場合、またはオーバーフローをサイレントにラップして正しい結果を生成できる場合、実際の実行では同じ結果を生成するだけで済み、プロモーションは省略される可能性があります。

したがって、操作で同じ結果が得られることがわかっている場合は、より広い値を使用する必要はありません。

しかし、標準で行われた特定の決定の背後にある理論的根拠が必要な場合は、それを見る必要があります、.....それを待つ、.....はい、理論的根拠文書:-)

その理論的根拠のセクション6.3.1.8(セクションは標準のセクションと一致します)には、次のように記載されています。

明示的なライセンスは、絶対に必要なものよりも「広い」タイプで計算を実行するために追加されました。これにより、正解は言うまでもなく、より小さく高速なコードが生成される場合があるためです。

同じ最終結果が得られる限り、まるでルールのように「より狭い」タイプで計算を実行することもできます。

于 2012-01-20T06:45:12.987 に答える
2

shortいくつかの命令セットアーキテクチャには、1ワード未満の整数(およびなど)を操作するための算術マシン命令がありませんchar。したがって、その規則を要求すると、コンパイラーにとって物事が簡単になります。そして、ほとんどの場合、ワードに変換してワードサイズのオペランドを操作するだけで十分です。

于 2012-01-20T06:45:33.977 に答える
0

これらの変換は、a、b、およびcが短い場合に発生しますか?

はい、整数拡張はすべての小さな整数型(char、short、C99 bool)で行われます。

厳密に言えば、Cプログラムはint、コンパイラーが整数の昇格を最適化しない限り、よりも小さいものに対していかなる形式の算術演算も実行できません。

于 2012-01-20T08:01:36.610 に答える