問題タブ [integer-promotion]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
8 に答える
691 参照

c - プレーンなintを64ビットにすると、多くの妥当なコードが壊れますか?

最近まで、私はほとんどのシステム実装者/ベンダーによるint、64ビットマシンでもプレーンな32ビットを維持するという決定を一種の便利な疣贅と考えていました。最新のC99固定サイズ型(int32_tおよびuint32_tなど)では、8、16、32、および64の各サイズの標準整数型が必要になることはほとんどなくなり、int64ビットにすることもできるようです。 。

ただし、Cのプレーンのサイズの最大の実際の結果は、intCが本質的に型よりも小さい演算を持たないという事実から生じintます。特に、intが32ビットより大きい場合、uint32_t値の算術演算の結果は型signed intになり、かなり不安定になります。

intこれは、実際の実装で32ビットに永続的に固定するのに十分な理由ですか?私はそう言うことに傾いています。32ビットを超えるuint32_tと壊れてしまうような、膨大な種類の用途があるように思われます。intにキャストバックしない限り、単項マイナスまたはビット単位の補数演算子を適用しても危険になりますuint32_t

もちろん、同じ問題が現在の実装にも当てはまりますuint16_tuint8_t、誰もがそれらを「より小さいint」タイプとして扱うことに気づいていて、慣れているようです。

0 投票する
2 に答える
1529 参照

c++ - C++での整数プロモーションと整数変換の違いは何ですか

C ++標準(整数拡張)のセクション4.5では、整数型をより高いランクの型に変換する特定のケースについて説明しています。

C ++標準(積分変換)のセクション4.7は(箇条書き4.7.1)で始まります。

整数型の右辺値は、別の整数型の右辺値に変換できます。列挙型の右辺値は、整数型の右辺値に変換できます。

私が理解している限り、4.5で説明されている変換(おそらく箇条書き4.5.3(列挙型)を除く)は、4.7セクションの手法のみを使用して実行できます。4.5.1と4.5.2は4.7.1で完全にカバーされています。4.5.4は4.7.4でカバーされています。では、4.5セクション全体の目的は何ですか?どのような追加の変換が可能になりますか?多分私はいくつかの制限を逃していますか?

PS私は標準のC++03バージョンを読んでいます。

0 投票する
3 に答える
11462 参照

c++ - 2 つの文字を加算すると int が生成されます

簡単なプログラムを作成し、GCC 4.4/4.5 で次のようにコンパイルしました。

g++ -c -Wconversion a.cpp

そして、私は次のものを持っています:

次のコードに対して同じ警告が表示されます。

2 つの文字 (または 2 つの unsigned short) を追加すると int が生成される理由を誰か説明してもらえますか? それはコンパイラのバグですか、それとも標準に準拠していますか?

ありがとう。

0 投票する
1 に答える
2824 参照

c++ - getopt() の例を理解する。int と char の比較

getopt が int を使用した理由と、getopt での optopt 変数の処理について理解していただければ幸いです。C++ の初心者です。

getopt を見ると、optopt は整数として定義されています。 http://www.gnu.org/software/libtool/manual/libc/Using-Getopt.html#Using-Getopt

ここの例 http://www.gnu.org/software/libtool/manual/libc/Example-of-Getopt.html#Example-of-Getopt

この例で私が理解できない部分は、switch ステートメントで整数を char と比較する方法「c」です。

私が理解しているように、主な引数geoptは機能していますが、文字配列argvであるため、intを返すという事実は奇妙に思えます。私の期待はcharであり、数値引数をintにキャストする必要があります。char は自動的に ANSI コードに変換され、再び変換されますか? printf ステートメント

私が理解しているようにcharを期待していますが、intが与えられています。文字配列を扱うときに getopt が int を使用するのはなぜですか?

本当に明らかな何かが欠けていますか?私はしなければならない。

0 投票する
5 に答える
7075 参照

c - intをcharに切り捨てる-定義されていますか?

静的アナライザーは、おそらくbビットが反転される前にintにプロモートされ、結果がint型になるため、最後の行の切り捨てについて不平を言いました。

プロモートされたintの最後のバイトにのみ関心があります。0x55の場合bは、0xAAである必要aがあります。私の質問は、C仕様は切り捨てがどのように発生するかについて何かを述べているのか、それとも実装が定義されている/定義されていないのかということです。私が期待する値が常に割り当てられることが保証されていaますか、それとも適合プラットフォームでうまくいかない可能性がありますか?

もちろん、割り当てる前に結果をキャストすると静的アナライザーが無音になりますが、そもそもこの警告を無視しても安全かどうかを知りたいと思います。

0 投票する
3 に答える
819 参照

c++ - 2 つの文字を追加するときに整数オーバーフローが発生しないのはなぜですか?

重複の可能性:
2 つの文字を加算すると int が生成される

次の C++ コードがあるとします。

出力は論理的に予想される150ですが、式に整数オーバーフローがあるべきではありません(a + b)か?

明らかに、ここでのオーバーフローに対処するために整数の昇格が必要です。そうでない場合、私には見えない何かが起こっています。誰かが私を啓発できるかどうか疑問に思っていたので、整数の昇格とオーバーフローに関して依存できるものと依存すべきでないものを知ることができます。

0 投票する
3 に答える
10271 参照

c++ - 二項演算子の両側の符号が異なる場合、昇格ルールはどのように機能しますか?

次のプログラムを検討してください。

+ 演算子は、返す正しい型をどのように「認識」しますか? 一般的な規則は、すべての引数を最も幅の広い型に変換することですが、ここでは と の間に明確な「勝者」はintありませんunsigned int。最初のケースでは、 の結果が得られるため、 がunsigned intの結果として選択されている必要があります。2 番目のケースでは、 の結果が得られるため、 を選択しているに違いありません。しかし、一般的なケースでは、これがどのように決定可能かはわかりません。私が見ているこの未定義の動作ですか、それとも何か他のものですか?operator+2147483648int-1

0 投票する
5 に答える
205 参照

c - int への整数昇格を証明する方法はありますか?

純粋な ansi C では、それを示す方法はありますか?

次のタイプ:

はintですか?

ありがとう。

注: 標準によればそうであることはわかっていますが、C++ では typeid 演算子を使用して表示できます。c1 + c2Cのintであることを示したいと思います。

0 投票する
4 に答える
1439 参照

c - unsigned int の下位 16 ビットに signed short を格納する

組み込みシステムで C をプログラミングしています。プロセッサ アーキテクチャは 32 ビット (sizeof(int)は 32 ビット、sizeof(short)は 16 ビット) です。下位 16 ビットのみが使用されるように指定されたメモリ マップド コントロール レジスタ ( ) である 32 ビット変数がありCTRL_REG、符号付き 16 ビット整数値が含まれます (上位ビットへの書き込みは影響しません)。メモリ アクセスは 32 ビットでアラインされている必要があるため、ポインターを数バイトにまたがらせることはできません。また、エンディアンを想定することもできません。符号ビットを必要なビット 15 に残すのではなく、ビット 31 に拡張することによって、自動型昇格が保存しているものを台無しにするのではないかと心配しています。この場所に何かを保管する最良の方法は何ですか?

これが私の元のコードで、これが間違っていることはほぼ確実です。

次に、これを試しましたが、割り当ての時点で整数昇格の対象となる可能性があると思います。

そして、最後に次のように考えました。

これらのオプションをうまく評価できないのは、calibrationValueたまたま負の値 (各デバイスに固有のキャリブレーション パラメーターであり、一部のデバイスでは正の可能性がある) であるため、テストですべて機能するためです。-2 を掛けた後、終了します。正の値を格納しているため、テストで予想している問題に実際には遭遇しません。

「考えすぎ」というだけでも、よろしくお願いします。