1. ホーム
  2. c++

CやC++で、算術演算の前にshortをintに変換しなければならないのはなぜか?

2023-08-16 02:38:49

疑問点

私が得た回答から この質問 の変換について、C++がこの要件を受け継いだようです。 shortint に変換することができます。 なぜ は、そもそもC言語で導入されたのでしょうか?なぜこれらの操作を short ?

例えば、( コメント中のdypさんの提案から抜粋 ):

short s = 1, t = 2 ;
auto  x = s + t ;

x int .

どのように解決するのですか?

もし私たちが 国際標準化プログラミング言語-Cの根拠 というセクションの 6.3.1.8 通常の算術変換 と書いてある( 強調は前へ ):

<ブロッククオート

これらの変換に関する規格のルールは、K&R のルールを少し修正したものです。 K&Rにあるものを少し修正したものです。 型と値保存ルールに対応したものです。 に明示的なライセンスが追加されました。 絶対必要以上に "広い "型で計算を実行する。 これにより、より小さく、より速いコードが生成されることがありますし、より頻繁に正しい答えが得られることは言うまでもありません。 より頻繁に正しい答えが得られることは言うまでもありません。 . また、計算を 同じ最終結果が得られる限り、as ifルールによって「より狭い」型でも計算を行うことができます。 として実行することもできます。明示的な鋳造は、常に 目的の型の値を得るために

6.3.1.8項 から C99 標準草案 通常の算術変換 のように、算術式のオペランドに適用されるもので、例えばセクション 6.5.6 加算演算子 は言う。

オペランドの両方が算術型である場合は 通常の算術演算 に変換されます。 が実行されます。

の部分にも同様の文章があります。 6.5.5 乗法演算子 にも同様の文章があります。の場合は 短い オペランドの場合、まず 整数のプロモーション が適用され、セクション 6.3.1.1 ブール値、文字、整数 というのがあります。

intが元の型のすべての値を表すことができる場合、その値はintに変換されます。 に変換され、そうでなければ、符号なしintに変換されます。 これらを整数型プロモーターと呼びます . 48) 他のすべての型は 整数のプロモションで変更されることはありません。

セクションからの議論 6.3.1.1 根拠または国際標準-プログラミング言語-C について 整数のプロモーション は、実際にはもっと面白いのですが、長すぎて完全には引用できませんので、選択的に引用します。

実装は以下のように分類されます。 つの主要な陣営 であり、その特徴は として 符号なし保存と値保存 .

[...]

その 符号なし保存のアプローチ は、2つの小さな をunsigned intに昇格させることです。これは単純なルールで、実行環境に依存しない 型が得られます。

値保存アプローチ は、これらの型を のすべての値を適切に表現できるのであれば符号付きint型に昇格させ、そうでなければ そうでなければ、これらの型を符号なし(unsigned)に昇格させます。 intに昇格させます。したがって、実行環境がshortをintより小さいものとして表現する場合、符号なしshortはintになります。 実行環境がshortをintより小さいものとして表現している場合、符号なしshortはintになり、そうでない場合は、符号なしintになります。 unsigned intになります。

これは場合によってはかなり予期せぬ結果をもたらすことがあります。 符号なし型と大きな符号付き型の間の暗黙の変換の一貫性のない動作 が示すように、そのような例はもっとたくさんあります。しかし、ほとんどの場合、これは期待されたとおりに動作する操作になります。