問題タブ [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.
language-design - 通常の算術変換-より良いルールのセット?
次のコードを検討してください。
C ++、C#、D、およびJavaでは、両方の関数呼び出しが「int」オーバーロードに解決されます...これは「仕様」に含まれていることをすでに認識していますが、言語がこのように設計されているのはなぜですか?もっと深い理由を探しています。
私にとって、結果が両方のオペランドのすべての可能な値を表すことができる最小の型であることが理にかなっています。たとえば、次のようになります。
これにより、などの不便なコードが排除されshort s3 = (short)(s1 + s2)
、IMOがはるかに直感的で理解しやすくなります。
これはCの時代からの残された遺産ですか、それとも現在の動作のより良い理由がありますか?
c - unsigned int と signed int が存在する C 式では、どの型がどの型に昇格されますか?
C言語標準のデータ型昇格規則について質問があります。C99 は次のように述べています。
C 整数昇格では、「int が元の型のすべての値を表すことができる場合、その値は int に変換されます。それ以外の場合は、unsigned int に変換されます」必要があります。
unsigned int
私の質問は、とが存在する C 言語式の場合signed int
、どの型がどの型に昇格されるかです。
たとえば、 (値より大きい値)int
のすべての値を表すことはできませんが、-ve 値を表すことはできません。そのような場合、どの型が何に昇格されますか?unsigned int
MAX_INT
unsigned int
c - C:8x8-> 16ビットの乗算精度は整数拡張によって保証されていますか?
私は、C標準(C90、ただしDerek Jonesの注釈付きC99ブックを使用しています)が、2つの符号なし8ビット値を乗算して16ビット結果に格納する精度を失わないことを保証するかどうかを理解しようとしています。ステートメントの例は次のとおりです。
当社のKeil8051コンパイラ(現在はv7.50)は、MSBをBレジスタに、LSBをアキュムレータに格納するMULAB命令を生成します。最初にfooをunsignedintにキャストした場合:
次に、コンパイラは、そこにunsigned intが必要であると正しく判断し、16x16ビット整数乗算ルーチンへの高価な呼び出しを生成します。合理的な疑いを超えて、この防御策は必要ないということを主張したいと思います。6.3.1.1で説明した整数昇格を読んだとき、最初の行の効果は、fooと10がunsigned intに昇格され、乗算が実行され、結果がfoo_u16にunsignedintとして格納されたかのようになります。コンパイラが、精度を損なうことなく8x8-> 16ビットの乗算を行う命令を知っている場合は、はるかに優れています。ただし、精度は保証されています。私はこれを正しく読んでいますか?
よろしく、クレイグブロム
integer-promotion - C 関数呼び出しでの引数の昇格
私は----から学びましたデフォルトの昇格がいつ始まるかについて: デフォルトの引数の昇格は、引数の予想される型が不明な場合、つまり、プロトタイプがない場合、または引数が可変長である場合に正確に使用されます。
しかし、私を混乱させる例は次のとおりです。
上記の例ではクリアされています: main で func を呼び出す場合、引数 a と b をプロモートする必要はありませんが、出力は &a = &b+1 ではなく &a = &b +4 を示します。昇格が行われなかった場合、2 つの CHAR 引数の間に 4 バイトあるのはなぜですか?
c++ - 参照によって引数を渡したり返したりするときの汎整数拡張?
私は過負荷の解決について何かを読んでいて、私を悩ませている何かを見つけました...次のコードで:
私の理解では、2つの一時的なintが作成され、SomeFunctionに属するスタックに割り当てられます。したがって、MaxValueが戻ると、r2はそれらの一時変数の1つ(この場合、値3を保持する変数)を参照します。したがって、r2を安全に渡すことができます。
問題は、私の理解が良ければ、これは標準的な動作ですか(確認してください)?そうでない場合は、上記のコードで何が起こっているのか説明してください。
どうもありがとう
c - ビットシフトと整数拡張?
通常、Cでは、二項演算子のオペランドを上位のオペランドのタイプにプロモートする必要があります。これを悪用して、コードに冗長なキャストを入力しないようにすることができます。次に例を示します。
等
ただし、少なくともgccでは、この動作はビットシフトでは機能しないことがわかりました。つまり
右側のオペランドのタイプによって左側のオペランドがにプロモートさunsigned long long
れ、シフトが成功することが期待されます。ただし、代わりに、gccは警告を出力します。
gccは壊れていますか、それとも標準はビットシフトの型昇格規則にいくつかの例外を設けていますか?
c - Yoda 条件と整数昇格
より大きい型int
を整数定数と比較する場合、正しい比較が確実に実行されるように、定数を左または右に配置する必要がありますか?
または、次のようにする必要があります。
-1LL
どちらの場合も(where int64_t
is )との比較と同一でない状況はありますlong long
か?
c - 算術演算中のデータ型の昇格:-1 <(unsinged int)1 == false
プリントしless than
ます。(unsigned char) 1
は、に変換されてから (signed char) 1
:に変換されるため、(signed) -1 < (signed) 1
出力は。になりますless than
。
しかし、上記のコードを次のように変更するとif ( (-1 < (unsigned int) 1 )
その場合、出力はNOT less than
です。
したがって、unsignedcharをunsignedintに変更すると、次のようになります。
- (signed)-1はunsignedintに変換されます[正反対のことが起こっています]
- -1は2の1の補数として格納されるため。ビットパターンは255と評価されます(おそらく)
- したがって、255 <1はfalseと評価され、それ以外の場合は実行されます。
int a = -1;
'-1'の代わりに置き換えても同じ結果
質問:
符号付きおよび符号なし演算中...符号付きが符号なしに変換されるか、またはその逆になるかを確認する方法。
unsigned charとcharの間で算術演算の変換が異なるのはなぜですか:明らかにunsignedはsignedとunsigned intに変換され、int:明らかにsignedはunsignedに変換されます
PS:これはコンパイラに依存しないことを私は知っています。だからそうは言わないでください。
c - char c = 0x80の場合、printf( "%d \ n"、c << 1)が-256を出力するのはなぜですか?
この場合、出力は-256
です。私が書くc << 0
と、出力は-128
です。
このコードの背後にあるロジックがわかりません。
c++ - インタビューの質問からのこのビット操作コードの問題点は何ですか?
私はこのページを見ていました: http://www.devbistro.com/tech-interview-questions/Cplusplus.jsp、そしてこの質問を理解していませんでした:
次のコードの潜在的な問題は何ですか?
注: 候補者が開発しているベース プラットフォームについて、候補者にヒントを与えます。それでもコードに問題が見つからない場合は、C++ の経験がありません。
誰かがそれについて詳しく説明できますか?
ありがとう!