CやC++で、算術演算の前にshortをintに変換しなければならないのはなぜか?
疑問点
私が得た回答から
この質問
の変換について、C++がこの要件を受け継いだようです。
short
を
int
に変換することができます。
なぜ
は、そもそも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になります。
これは場合によってはかなり予期せぬ結果をもたらすことがあります。 符号なし型と大きな符号付き型の間の暗黙の変換の一貫性のない動作 が示すように、そのような例はもっとたくさんあります。しかし、ほとんどの場合、これは期待されたとおりに動作する操作になります。
関連
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] template "と "typename "キーワードはどこに、なぜ入れなければならないのですか?
-
[解決済み] マクロで無意味なdo-while文やif-else文を使っているのはなぜですか?
-
[解決済み] なぜ (int)x ではなく static_cast<int>(x) を使うのですか?
-
[解決済み] C++のヘッダーファイルで#ifndefと#defineが使われているのはなぜですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】getline()が何らかの入力の後に使用されると動作しない 【重複あり
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] なぜJava APIはshortやbyteの代わりにintを使うのですか?