問題タブ [narrowing]
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++ でのナローイング変換
Beejの Guide to Network Programmingには、16 ビット整数をシリアル化する移植可能な方法を提供するための関数があります。
*buf++ = i;
符号なし整数 ( i
) を符号なし文字 ( *buf
) に代入すると縮小変換が発生するため、ステートメントが移植可能である理由がわかりません。
- C++ 標準では、このような変換で
unsigned int
が常に切り捨てられ、その最下位 8 ビットが に保持されることが保証されていunsigned char
ますか? そうでない場合、問題を解決するための好ましい方法はありますか? 関数本体を次のように変更するのは適切ですか?
*buf++ = (i>>8) & 0xFFFFU; *buf++ = i & 0xFFFFU;
c++ - C++11: モジュラスを使用した「{ } 内の変換の縮小」
次のコードを有効にしてコンパイルしようとしgcc
ましC++11
た。
次の警告が表示されます。
{ } 内の '(id % 3u)' の 'unsigned int' から 'unsigned char' へのナローイング変換 [-Wnarrowing]
id %3の結果がunsigned charに収まることをコンパイラが見つけられるようにする方法はありますか?
c++ - リストの初期化で bool への変換を狭める - 奇妙な動作
次の C++11 コードを検討してください。
の初期化で double から bool への縮小変換がありますx
。標準に関する私の理解によれば、これは不正なコードであり、何らかの診断が必要です。
Visual C++ 2013 で次のエラーが発生します。
ただし、Clang 3.5.0 と GCC 4.9.1 の両方で、次のオプションを使用します。
エラーや警告なしでこのコードをコンパイルしてください。プログラムを実行すると、1
(驚くことではありません) が出力されます。
では、さらに奇妙な領域に足を踏み入れてみましょう。
に変更X(bool arg)
するX(int arg)
と、突然、Clang からエラーが発生しました
そしてGCCからの警告
これは私が期待していたもののように見えます。
ここで、bool
コンストラクターの引数を保持し (つまり、 に戻してX(bool arg)
)、 に変更double d = 7.0;
しint d = 7;
ます。繰り返しますが、Clang からの縮小エラーですが、GCC は診断をまったく発行せず、コードをコンパイルします。
定数をコンストラクターに直接渡すと得られる動作のバリエーションがいくつかありますが、奇妙なものもあれば、予想されるものもありますが、ここではそれらをリストしません。この質問は長くなりすぎています。
これは、標準準拠に関して VC++ が正しく、Clang と GCC が間違っているというまれなケースの 1 つだと思いますが、これらのコンパイラのそれぞれの実績を考えると、私はまだこれについて非常に躊躇しています。
専門家はどう思いますか?
標準参照 (C++11 の最終標準ドキュメント、ISO/IEC 14882-2011 からの引用):
8.5.4 [dcl.init.list] パラグラフ 3 には、次のものがあります。
— それ以外の場合、T がクラス型の場合、コンストラクターが考慮されます。適用可能なコンストラクターが列挙され、オーバーロード解決 (13.3、13.3.1.7) によって最適なコンストラクターが選択されます。引数のいずれかを変換するために縮小変換 (以下を参照) が必要な場合、プログラムは不適切な形式です。
同じセクションのパラグラフ 7 には、次のようなものがあります。
縮小変換は、
浮動小数点型から整数型へ、または
long double から double または float へ、または double から float への暗黙的な変換です。ただし、ソースが定数式で、変換後の実際の値が次の場合を除きます。表現できる値の範囲内 (正確に表現できない場合でも)、または
— ソースが定数式であり、変換後の実際の値である場合を除き、整数型またはスコープなし列挙型から浮動小数点型へターゲット型に適合し、元の型に変換されたときに元の値を生成する、または
— ソースが定数式であり、変換後の実際の値がターゲットの型に適合し、元の値を生成する場合を除き、整数型またはスコープなし列挙型から、元の型のすべての値を表すことができない整数型へ元の型に戻すと。
[注: 上で示したように、そのような変換はリストの初期化の最上位では許可されていません。—注の最後]
3.9.1 [basic.fundamental] パラグラフ 7 には、次のものがあります。
型 bool、char、char16_t、char32_t、wchar_t、および符号付きおよび符号なしの整数型をまとめて整数型と呼びます。48 整数型の同義語は整数型です。
(私はこの段階ですべてに疑問を持ち始めていました...)
c++ - 警告: 縮小変換 C++11
g++ 4.9.0 -O2 -std=c++11
警告が表示されます:
しかし、関数内で(...)
insted を使用すると、警告が消えます。なんで?{...}
operator-
c++ - { } 内の '65280' の 'int' から 'short int' への変換の縮小
私は2つの配列を持っています:
コンパイルすると、次のメッセージが表示されます。
[警告] { } 内の '65280' の 'int' から 'short int' へのナローイング変換 [-Wnarrowing]
0xFF0D や 0xFFFF など、FF を含む各要素に対して
また、いつもアクセス違反になります。なんで?どうすれば修正できますか?
c# - C# の符号付きおよび符号なしの整数は、両方の方法で縮小変換されますか?
MSDN の記事によると: https://msdn.microsoft.com/en-us/library/8s682k58%28v=vs.80%29.aspx
一部のコンパイラでは、縮小変換をサポートするために明示的な変換が必要です。
上記のmsdnリンクで行われた声明に基づいて、それを言うのは安全ですか
int から uint への変換は縮小変換です
また、
uint から int への変換は縮小変換です
?