問題タブ [twos-complement]

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.

0 投票する
10 に答える
80406 参照

java - Javaでは整数はビットレベルで内部的にどのように表されますか?

Javaが整数を内部的に格納する方法を理解しようとしています。私はすべてのJavaプリミティブ整数が署名されていることを知っています(短いものを除く?)。これは、その数値の1バイトで使用可能なビットが1つ少ないことを意味します。

私の質問は、すべての整数(正と負)が2の補数として格納されているのか、それとも2の補数の負の数だけなのかということです。

スペックにあることがわかりますx bit two's complement number。しかし、私はしばしば混乱します。

例えば:

編集

明確にするために、x = 15

したがって、答えが all2の補数として格納されている数値の場合、次のようになります。

ここでも混乱しているのは、どちらも負の数であるという記号です。私はそれを誤解/誤解している可能性がありますか?

編集 私の質問が混乱しているのかわからない。質問を分離することを余儀なくされました:

私の質問は正確に:正の数はに保存されますbinary as isが、負の数はとして保存されtwo's complementますか?

すべてが2の補数に格納されていると言う人もいれば、負の数だけが2の補数として格納されているという回答もあります。

0 投票する
5 に答える
10956 参照

c - 2の補数を使用してintからバイナリ文字列、intに変換する

100011102の補数を使用していることがわかっているバイナリ文字列があります。私はそれが8ビットになることを知っています。

unsigned intそれは142に等しいの形で私に与えられます。

次に、これをに変換し直す必要があります10001110

次に、すべてのビットを反転して1つ追加すると、次のようになります。01110010

次に、これをsigned int-114に変換します。

これどうやってするの?私はCに比較的慣れておらず、それを理解しようと何年も費やしてきました。

基本的に、142を受け取り、 -114unsigned intを返す関数を作成したいと思います。signed int

0 投票する
3 に答える
2196 参照

binary - 2の補数

私の知る限り、2の補数は次のとおりです。

1.小数を2進数で表します。
2.すべてのビットを反転します。
3.最後のビットに1を追加します。

3その表現である数の場合0000000000000011、2の補数の結果は次のよう1111111111111101になります-3
ここまでは順調ですね。しかし、2その表現が00000000000000102の補数の結果である数は、 11111111111111012ではなく-3になります。
私は何が間違っているのですか?

0 投票する
4 に答える
341 参照

c# - Why does BitConverter shrink my already allocated array? (I'm trying to prevent a two's complement issue)

I am allocating an array that is intentionally bigger than the result of BitConverter.GetBytes. My goal is to leave the last byte empty so that I can prevent this number from being seen as the two's compliment and have tempPosBytes2[

When I run BitConverter.GetBytes my array tempPosBytes2 seems to shrink.

Question

What is going on under the covers, and how can I leave the trailing byte without copying the array?

I need this to work with BigInteger(byte[]) as in the following:

0 投票する
2 に答える
921 参照

c# - BigIntegerにこの16進文字列のバイナリ表現を正しく表示させるにはどうすればよいですか?

問題

16進文字列に変換されたが、byte[]その文字列は次のように解析されますBigInteger.Parse(thatString,NumberSyles.Hexnumber)

2の補数が考慮されている限り、BigIntegerはbyte []を受け入れることができるため、これは無駄に思えます。


実用的な(非効率的な)例

MSDNによると、次の16進数が正の数値になるためには、最後のバイトの最上位ビットがゼロである必要があります。以下は、この問題がある16進数の例です。

さて、その文字列を静的メソッドに渡しましょうBigInteger

データのベースラインと、機能する既知の変換ができたので、データをより良く/より速く/などにしたいです。


動作しない(効率的な)例

今の私の目標は、にラウンドトリップしbyte[]BigInt結果をのようにすることです 25420294593250030202636073700053352635053786165627414518。始めましょう:

したがって、MSDNによると、数値が2の補数として表示されないように、最後のバイトにゼロが必要です。ゼロを追加して印刷し、次のことを確認します。

さて、それを:byte[]のコンストラクターに渡しましょう。BigInteger

スキップしたのは、末尾のゼロを追加しない場合にbigIntがバイト配列に対して行うことのサンプルです。何が起こるかというと、私は間違った負の数を取得します。よろしければ投稿します。

だから私は何が間違っているのですか?

0 投票する
3 に答える
16028 参照

assembly - x86(-64)で符号付きと符号なしの乗算が異なる命令になるのはなぜですか?

2の補数の要点は、符号付きと符号なしの数値に対して同じ方法で操作を実装できることだと思いました。ウィキペディアは、利益をもたらす操作の1つとして、乗算を具体的にリストしています。では、なぜx86にはそれぞれに個別の命令があるのmulですimulか?これはx86-64にも当てはまりますか?

0 投票する
4 に答える
1127 参照

c++ - コード スニペット「int i:2;」での C++ の「:」演算子の使用について説明します。

重複の可能性:
この C++ コードの意味は何ですか?

次の C++ コードでは

次のコードを実行すると、出力 1 -2 3 が得られます

上記のコードを参照して、「:」演算子の意味と、この奇妙な出力の理由を説明してください。

0 投票する
2 に答える
3941 参照

java - n ビットの 2 の補数の絶対値の計算

このメソッドは、絶対値を取得しようとしている n ビットの 2 の補数と、その数値が得られるビット数を受け取ります。ここではいくつかの例を示します。

腹筋 (0x00001234, 16); // => 0x00001234

abs(0x00001234, 13); // => 0x00000DCC

したがって、最初の例では、0x00001234 が 0x00001234 であることがわかります。これは、16 ビットでは、それ自体であるのに十分な先行ゼロがあるためです。

ただし、2 番目の例では、13 ビットを使用すると 0x00001234 の符号ビットが 1 になるため、この 13 ビットの数値を正の数値に変換すると、0x00000DCC が得られます。

これまでのところうまくいくはずですが、場合によってはうまくいきません:/何が間違っているのか、どの方向に進むべきなのか、何か考えはありますか?

編集: また、言及するのを忘れていましたが、1 だけインクリメントしない限り、>>> や +、-、*、/ は使用できません。

0 投票する
3 に答える
66733 参照

binary - 2 の補数を使用したバイナリ減算

2 の表現を使用し、各数値に 5 ビットを使用してバイナリで減算するのに助けが必要です。

1) -9 -7 = ? オーバーフローしていませんか?

-9 = 01001 (2 の補数 = 10111) および -7 = 00111 (2 の補数 = 11001)

2 の補数を使用しているため、追加する必要があります。

10111 +11001 = 100000 しかし、この答えは意味がありません。また、答えに 5 ビット以上あるため、オーバーフローがあると想定しています。

2) 6 - 10、前と同じプロセス。負の 2 進数は意味をなさない

0 投票する
2 に答える
15094 参照

vhdl - 加算器を使用せずに数の 2 の補数を作成する方法

数値の符号を反転する 2 の補数では、通常、すべてのビットを否定して 1 を追加します。たとえば、次のようになります。

VHDL では次のとおりです。

このように、シンセサイザーは N ビットの加算器を使用します。

加算器を使用せずに、別のより効率的なソリューションはありますか?