問題タブ [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.
c - プレーンなintを64ビットにすると、多くの妥当なコードが壊れますか?
最近まで、私はほとんどのシステム実装者/ベンダーによるint
、64ビットマシンでもプレーンな32ビットを維持するという決定を一種の便利な疣贅と考えていました。最新のC99固定サイズ型(int32_t
およびuint32_t
など)では、8、16、32、および64の各サイズの標準整数型が必要になることはほとんどなくなり、int
64ビットにすることもできるようです。 。
ただし、Cのプレーンのサイズの最大の実際の結果は、int
Cが本質的に型よりも小さい演算を持たないという事実から生じint
ます。特に、int
が32ビットより大きい場合、uint32_t
値の算術演算の結果は型signed int
になり、かなり不安定になります。
int
これは、実際の実装で32ビットに永続的に固定するのに十分な理由ですか?私はそう言うことに傾いています。32ビットを超えるuint32_t
と壊れてしまうような、膨大な種類の用途があるように思われます。int
にキャストバックしない限り、単項マイナスまたはビット単位の補数演算子を適用しても危険になりますuint32_t
。
もちろん、同じ問題が現在の実装にも当てはまりますuint16_t
がuint8_t
、誰もがそれらを「より小さいint
」タイプとして扱うことに気づいていて、慣れているようです。
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バージョンを読んでいます。
c++ - 2 つの文字を加算すると int が生成されます
簡単なプログラムを作成し、GCC 4.4/4.5 で次のようにコンパイルしました。
g++ -c -Wconversion a.cpp
そして、私は次のものを持っています:
次のコードに対して同じ警告が表示されます。
2 つの文字 (または 2 つの unsigned short) を追加すると int が生成される理由を誰か説明してもらえますか? それはコンパイラのバグですか、それとも標準に準拠していますか?
ありがとう。
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 を使用するのはなぜですか?
本当に明らかな何かが欠けていますか?私はしなければならない。
c - intをcharに切り捨てる-定義されていますか?
静的アナライザーは、おそらくb
ビットが反転される前にintにプロモートされ、結果がint型になるため、最後の行の切り捨てについて不平を言いました。
プロモートされたintの最後のバイトにのみ関心があります。0x55の場合b
は、0xAAである必要a
があります。私の質問は、C仕様は切り捨てがどのように発生するかについて何かを述べているのか、それとも実装が定義されている/定義されていないのかということです。私が期待する値が常に割り当てられることが保証されていa
ますか、それとも適合プラットフォームでうまくいかない可能性がありますか?
もちろん、割り当てる前に結果をキャストすると静的アナライザーが無音になりますが、そもそもこの警告を無視しても安全かどうかを知りたいと思います。
c++ - 2 つの文字を追加するときに整数オーバーフローが発生しないのはなぜですか?
重複の可能性:
2 つの文字を加算すると int が生成される
次の C++ コードがあるとします。
出力は論理的に予想される150ですが、式に整数オーバーフローがあるべきではありません(a + b)
か?
明らかに、ここでのオーバーフローに対処するために整数の昇格が必要です。そうでない場合、私には見えない何かが起こっています。誰かが私を啓発できるかどうか疑問に思っていたので、整数の昇格とオーバーフローに関して依存できるものと依存すべきでないものを知ることができます。
c++ - 二項演算子の両側の符号が異なる場合、昇格ルールはどのように機能しますか?
次のプログラムを検討してください。
と
+ 演算子は、返す正しい型をどのように「認識」しますか? 一般的な規則は、すべての引数を最も幅の広い型に変換することですが、ここでは と の間に明確な「勝者」はint
ありませんunsigned int
。最初のケースでは、 の結果が得られるため、 がunsigned int
の結果として選択されている必要があります。2 番目のケースでは、 の結果が得られるため、 を選択しているに違いありません。しかし、一般的なケースでは、これがどのように決定可能かはわかりません。私が見ているこの未定義の動作ですか、それとも何か他のものですか?operator+
2147483648
int
-1
c - int への整数昇格を証明する方法はありますか?
純粋な ansi C では、それを示す方法はありますか?
次のタイプ:
はintですか?
ありがとう。
注: 標準によればそうであることはわかっていますが、C++ では typeid 演算子を使用して表示できます。c1 + c2
Cのintであることを示したいと思います。
c - unsigned int の下位 16 ビットに signed short を格納する
組み込みシステムで C をプログラミングしています。プロセッサ アーキテクチャは 32 ビット (sizeof(int)
は 32 ビット、sizeof(short)
は 16 ビット) です。下位 16 ビットのみが使用されるように指定されたメモリ マップド コントロール レジスタ ( ) である 32 ビット変数がありCTRL_REG
、符号付き 16 ビット整数値が含まれます (上位ビットへの書き込みは影響しません)。メモリ アクセスは 32 ビットでアラインされている必要があるため、ポインターを数バイトにまたがらせることはできません。また、エンディアンを想定することもできません。符号ビットを必要なビット 15 に残すのではなく、ビット 31 に拡張することによって、自動型昇格が保存しているものを台無しにするのではないかと心配しています。この場所に何かを保管する最良の方法は何ですか?
これが私の元のコードで、これが間違っていることはほぼ確実です。
次に、これを試しましたが、割り当ての時点で整数昇格の対象となる可能性があると思います。
そして、最後に次のように考えました。
これらのオプションをうまく評価できないのは、calibrationValue
たまたま負の値 (各デバイスに固有のキャリブレーション パラメーターであり、一部のデバイスでは正の可能性がある) であるため、テストですべて機能するためです。-2 を掛けた後、終了します。正の値を格納しているため、テストで予想している問題に実際には遭遇しません。
「考えすぎ」というだけでも、よろしくお願いします。