問題タブ [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++ - char はデフォルトで昇格されますか?
これはばかげた質問かもしれませんが、誰かが C++11 と C11 の標準リファレンスを提供してくれませんか:
char
デフォルトで昇格されていint
ますか?
ここで少し背景を説明します。C と C++ の両方に、既定の引数昇格の概念があります(C++11: 5.2.2/7; C11: 6.5.2.2/6)。これにより、次の呼び出しで引数が昇格されます。
関数呼び出しの場合、a
は に変換されdouble
、b
は に変換されint
ます。しかし、どうなりc
ますか?私は常にchar
も に昇格するという印象を受けてきましint
たが、基準に関連するステートメントを見つけることができません。
c - 式を評価するとき、整数の昇格は常に行われますか?
重複の可能性:
幅の広い整数に代入するときの C 整数オーバーフローの動作
グーグルでこれに関する明確な答えが見つかりませんでした。次の 2 つの式があるとします。
式(a16 * b16) / a16
and を評価するとき(a8 * b8) / a8
、それらは評価中に常に昇格さint
れ、最終結果は代入の直前に目的の型 (int16_t
または) に変換されますか、それともこの整数昇格は完全にオプションですか? int8_t
整数式の評価中の整数昇格は常に行われますか、それとも単純に許可されますか?
常に行われている場合、2 つの操作がオーバーフローしないことが期待できます ( int
32 ビットであると仮定します)。実行のみが許可されている (必須ではない) 場合、操作がオーバーフローする可能性があります。挙動をよく知りたいです。
c - 省略記号を介して送信された場合の「long」および「size_t」の整数昇格?
実装している誰かの観点からこの質問を見てprintf
ください。
の引数はprintf
省略記号 ( ...
) を介して渡されるため、整数に昇格されます。私はそれを知っていてchar
、昇進short
しないのに昇進します。同様に、対応するものについても。int
int
long long
unsigned
これは、varargs を読み取るときに、 にva_arg(args, int)
は を使用しchar
、short
にはint
whileva_arg(args, long long)
を使用する必要があることを意味しlong long
ます。
私の質問は、昇進long
しsize_t
て昇進することです。整数の昇格に関する情報源はインターネット上にたくさんありますが、これらの型について言及しているものは見たことがありません。
PS標準への参照をいただければ幸いです。
c++ - 1つのdoubleは、方程式のすべてのintをdoubleに昇格させますか?
1つの浮動小数点データ型(たとえばdouble
)が存在することで、すべての+、-、*、/、%などの数学演算が2つのオペランドを想定するようになりますか?
話がそれよりも複雑な場合、これらのルールを説明するリソースはありますか?私はそのような質問をするべきではなく、方程式の結果がであるときに常に明示的にキャストint
する必要があります。これが私が考えているいくつかの方程式です。これはコンパイラに依存する可能性のあるタイプであるため、意図的にコンパイルしてシステム上で実行しませんでした。double
double
c++ - common_type ではない理由::type = long long?
common_type<long, unsigned long>::type
これはunsigned long
、整数昇格後のオペランドに関して、標準が述べているためです...
[...]符号なし整数型を持つオペランドのランクが他のオペランドの型のランク以上の場合、符号付き整数型のオペランドは符号なし整数型のオペランドの型に変換されます
整数昇格システムをバグと呼ぶわけではありませんが、符号付きオペランドと符号なしオペランドの両方の範囲を表すことができる、より大きな符号付き整数型がある場合は、それを使用する必要があるようです。
一部のプラットフォームでは long == long long になる可能性があることを知っています。その場合、上記のルールが有効になります。しかし、より大きな符号付き整数型が利用可能であれば、それを使用すべきではないでしょうか?
c++ - 整数昇格 - 手順は何ですか
このコードは B2 を出力します
整数昇格について読みましたが、まだ不明です。ここの例ではどのように機能しますか? コンパイラが値を拡大/切り捨てる際に従う手順を誰かが完全に投稿できますか?
c++ - 整数型の拡大?
この関数があると想像してください:
これで、呼び出しサイトで次のように呼び出します。
なぜ、(技術的に) 関数の宣言で a を期待していることを指定しlong
、接尾辞なしで数値だけを渡すと、L
それは として扱われるのint
ですか?
さて、C++ 標準がそう言っているためであることはわかっていますが、これ65
が型に昇格されただけでなく、サフィックスをlong
忘れて明示的に long にするというばかげたエラーを回避する技術的な理由は何ですか?L
C++標準でこれを見つけました:
4.7 積分変換 [conv.integral]
5 インテグラル プロモーションとして許可されているコンバージョンは、インテグラル コンバージョンのセットから除外されます。
縮小変換が暗黙的に行われていないことは考えられますが、ここでは宛先の型がソースの型よりも明らかに広くなっています。
編集
この質問は、サフィックス を指定しなかった場合に奇妙な動作があった、以前に見た質問に基づいています。Exampleですが、おそらくそれは C++ よりも C のことでしょうか?!!L
c++ - 整数拡張、符号付き/符号なし、およびprintf
私はC++整数のオーバーフローとプロモーションを調べていて、それを複製しようとしましたが、最終的には次のようになりました。
上記cout
の投稿を読んだ後、私が期待したことを実行します。2番目の投稿も同様printf
です。どちらも4294967291を印刷printf
します。ただし、最初の投稿は-5を印刷します。さて、これはprintf
単に4294967291の符号なしの値を符号付きの値として解釈し、最終的に-5になると思います(4294967291の2の補数が11 ... 11011であることがわかります)が、私は100ではありません%私は何も見逃していないと確信しました。それで、私は正しいですか、それともここで何か他のことが起こっていますか?
c - 型変換 - unsigned から signed int/char へ
以下のプログラムを実行してみました。
このプログラムでは、次の出力が得られます。
文字は違います!!! intは同じです!!!
両方で異なる出力が得られるのはなぜですか?
出力は次のようになりますか?
文字は同じです!!! intは同じです!!!
コードパッド リンク。