問題タブ [signedness]
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 と cast に対する符号の影響の説明)
私は、C++ でバイトを扱うときに char を使用するライブラリを頻繁に使用します。別の方法は、「Byte」を unsigned char として定義することですが、使用することを決定した標準ではありません。私は頻繁に C# から C++ dll にバイトを渡し、それらを char にキャストしてライブラリを操作します。
int を chars に、または chars を他の単純な型にキャストする場合、発生する可能性のある副作用にはどのようなものがありますか。具体的には、あなたが取り組んできたこの壊れたコードはいつ発生し、どのようにして char の符号が原因であることがわかりましたか?
幸いなことに、コードでこれに遭遇したことはありません。学校の組み込みシステムのクラスで、char 署名されたキャスト トリックを使用しました。私が行っている仕事に関連していると感じているので、この問題をよりよく理解したいと思っています。
c# - miscutilを使用したC#とJavaのビッグエンディアンバイトの違い
ソケットを使用してJavaとC#アプリケーションの間で通信するためにmiscutilライブラリを使用しています。次のコードの違いを理解しようとしています(これはGroovyですが、Javaの結果は同じです)。
およびC#:
ご覧のとおり、最後のバイトは-120
Javaバージョンと136
C#です。
c - strncat で文字列を連結すると、符号のエラーが発生する
更新: char、signed char、または unsigned のいずれが最終的にここで問題になるかという点。memcpy はバイトに対して無差別に動作するため、この状況では memcpy を使用する方が適切でした。
これ以上簡単な操作はありませんが、重要なステップが欠けているようです。次のコードでは、符号の違いについてコンパイラが警告する内容を埋めようbufferdata
としています。buffer
language-agnostic - 有限浮動小数点値の場合、x --x == 0であることが保証されていますか?
浮動小数点値は不正確です。そのため、比較で厳密な数値の等式を使用することはめったにありません。たとえば、Javaでは、これは次のように出力されますfalse
(ideone.comで見られるように)。
通常、浮動小数点計算の結果を比較する正しい方法は、ある期待値に対する絶対差が、許容されるイプシロンよりも小さいかどうかを確認することです。
問題は、いくつかの操作が正確な結果をもたらすことができるかどうかについてです。有限でない浮動小数点値x
(つまり、NaN
または無限大)の場合、x - x
は常に NaN
です。
しかし、x
が有限である場合、これのいずれかが保証されますか?
x * -1 == -x
x - x == 0
(特に私はJavaの動作に最も興味がありますが、他の言語についての議論も歓迎します。)
それが価値があることについては、私は(そして私はここで間違っているかもしれませんが)答えはイエスだと思います!有限のIEEE-754浮動小数点値に対して、その反数が常に正確に計算可能であるかどうかに要約すると思います。たとえば、符号専用のビットが1つあるのでfloat
、これdouble
が当てはまるようです。これは、反数を見つけるために符号ビットを反転するだけでよいためです(つまり、仮数はそのままにしておく必要があります)。
関連する質問
assembly - Z80アセンブラ/マシンコードでは、バイト/ワード/アドレスは符号付きですか、符号なしですか?
Z80 バイナリ用のエミュレーターを作成していますが、すべての整数データ型が署名されているか署名されていないかをマニュアルまたは Google から確認できません。では、register A
、B
...などからの数字は署名されていますか?HL
BC
また、マシンコードでは、命令の後に引数が符号付きまたは符号なしとして来るバイト/ワード/アドレスがありますか?
これらの例のように ( 8080/Z80 Instruction Setから):
前もって感謝します。
c - charの符号はインターフェースの問題ですか?
私が関数を持っているとしましょう
これは、内部的には、入力をNULで終了するバイトのブロックとして扱う必要があります(たとえば、文字列のハッシュ関数です)。関数内で引数をにキャストできunsigned char*
ます。宣言を次のように変更することもできます
さて、char
とsigned char
はunsigned char
3つの異なるタイプであるとすると、Cの「インターフェイス」という用語の合理的な定義の下で、これはインターフェイスの変更を構成しますか?
(この質問は、別の質問によって提起された議論を解決することを目的としています。私は意見を持っていますが、他の人の投票によって「勝者」として現れるまで答えを受け入れません。)
c++ - 浮動小数点数の符号
浮動小数点数の符号を判別する簡単な方法はありますか?
私は実験してこれを思いついた:
where (c[3] & 0x10000000) は、負の数に対して値> 0を与えますが、これには次の仮定を行う必要があると思います:
- マシンのバイトは 8 ビットです
- 浮動小数点数は 4 バイトですか?
- マシンの最上位ビットは左端のビットです (エンディアン?)
これらの仮定のいずれかが間違っている場合、または見逃している場合は、修正してください。
ruby - 署名されたリトルエンディアンをRubyで解凍します
だから私はいくつかのMongoDBプロトコルのものに取り組んでいます。すべての整数はリトルエンディアンで署名されています。Rubyの標準的な方法を使用して、整数からArray#pack
必要なバイナリ文字列に変換できます。
ただし、逆に言えば、このメソッドには、特に符号なし整数String#unpack
を返すものとして文書化された「V」形式があります。
符号付きリトルエンディアンのバイトオーダー用のフォーマッタはありません。ビットシフトを使ってゲームをプレイしたり、配列パッキングを使用しない独自のバイトマングリングメソッドを作成したりできると確信していますが、他の誰かがこれに遭遇して簡単な解決策を見つけたのではないかと思います。どうもありがとう。
c - たとえば、Cでは、シフトの第2オペランドに符号を付けることができるのはなぜですか。
注:この質問は、ビットシフト演算子<<および>>の第2オペランドの符号に関するものです。最初のオペランドについてはまったくありません。
CERT INT34-C、一部:負のビット数をシフトしないでください..。
それが正当化を必要としたというわけではありませんが、彼らはそれが未定義の振る舞いであると言って正当化します。
他の方向にシフトしたい場合は、他の方向に適切なシフト演算子を使用して正のビット数だけシフトするため、このルールは理にかなっていると思います。
したがって、Cで、負のビット数だけシフトする必要がなく、未定義の場合、<<または>>の第2オペランドに符号を付けることさえ許可されるのはなぜですか?
たとえば、MISRA-C:2004(MISRAが好きか嫌いかは何でも)のセクション6.10.2で、結果のタイプが最初のオペランドのみに依存することを説明する副作用として、「2番目のオペランドはオペランドは、任意の符号付きまたは符号なし整数型にすることができます。[強調鉱山]
ビットシフトで符号付き第2オペランドを使用するように人々を招待するのはなぜですか?なぜそれを許可するのですか?コンパイラはそれに対して警告しますか?