問題タブ [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 - C での変数昇格
これらの特定のケースごとに出力が異なる理由を理解するのに問題があります。サンプル コード a では、期待どおりに変数の昇格があり、> 6
その結果は ですが、サンプル コード b では、結果は<= 6
次のようになります。
出力:
c - 特定のビット演算を実行中に uint64_t の上位 32 ビットが 1 になるのはなぜですか?
uint64_t
ケース番号#2でaの上位32ビットが1に設定されている理由を誰かに説明してもらえますか:
出力:
同じ動作を示さない「同等の」32ビットバージョン(ケース#3および#4)を提供したことに気付くでしょう...
c - char と short は代入式で降格される前に int に昇格されますか?
いくつかの調査を行った後、算術式で char と short が内部的に int に昇格されることがわかりました。しかし、そのような整数の昇格が割り当てで内部的に発生するかどうかはまだ疑問です。
(ですから、他の式に関するリンクだけを私に与えないでください。私は、ASSIGNMENT 式の内部で何が起こるかについて質問しています)
Q: 次のうち、社内で発生するのはどれですか?
1、ch1 の値がそのまま ch2 に代入されます。ここでは整数の昇格は行われません。
2, ch1の値をまずint型に昇格(8ビット→32ビット)し、32ビットの値をchar型の8ビットに降格して最終結果。整数の昇格はここで行われます。
私はこの本を見つけました: C Primer Plusの 174 ページには:
「...式に現れると、char と short は、signed と unsigned の両方で、自動的に int に変換されるか、必要に応じて unsigned int に変換されます...」
だから私はそれが 2 であるべきだと思いますが、整数昇格が起こらない 1 であるべきだと誰かが私に言ったのを聞いたことがあります。
私は本当に混乱しています。私を手伝ってくれますか?前もって感謝します。
c - Cのリテラルと変数の違いは何ですか(符号付きと符号なしの短い整数)?
私は本Computer Systems: A Programmer's Perspective, 2/Eで次のコードを見たことがあります。これはうまく機能し、目的の出力を作成します。出力は、符号付き表現と符号なし表現の違いによって説明できます。
上記のコードは を生成-1 >= 0u
しますが、上記と同じである次のコードは生成しません! 言い換えると、
利回り-1 < 0u
。なぜこれが起こったのですか?これは説明できません。
このような同様の質問を見たことがありますが、役に立たないことに注意してください。
PS。@Abhineetが言ったように、ジレンマはに変更short
することで解決できますint
。しかし、この現象をどのように説明できるでしょうか。つまり、-1
4 バイトでは0xff ff ff ff
、2 バイトでは0xff ff
です。として解釈される 2 の補数としてそれらを考えるとunsigned
、それらは と の対応する値を4294967295
持ち65535
ます。どちらも 未満ではなく、どちらの場合も、出力は、つまり で0
ある必要があると思います。-1 >= 0u
x >= u
リトルエンディアン Intel システムでの出力例:
略して:
int の場合:
c++ - unsigned short (乗算) unsigned short が signed int に変換されるのはなぜですか?
が C++11 にunsigned short * unsigned short
変換されるのはなぜですか?int
このint
コード行で示されているように、 は小さすぎて最大値を処理できません。
MinGW 4.9.2 でのオーバーフロー
なぜなら (ソース)
USHRT_MAX = 65535 (2^16-1) 以上*
INT_MAX = 32767 (2^15-1) 以上*
と(2^16-1)*(2^16-1) = ~2^32
。
このソリューションに問題はありますか?
このプログラム
出力を与える
の上
両方と
これは、これらのコンパイラt*t
で に変換されることを証明しています。int
役立つリソース:
https://bytes.com/topic/c-sharp/answers/223883-multiplication-types-smaller-than-int-yields-int
http://www.cplusplus.com/reference/climits
http://en.cppreference.com/w/cpp/language/types
編集:次の画像で問題を示しました。