C言語関係掲示板

過去ログ

No.987 「2の補数」の算出の方法を教えて下さい

[戻る] [ホームページ]

※ 投稿者による親記事の削除が行われていますので、返信のみログを残します。

No.12903

Re:「2の補数」の算出の方法を教えて下さい
投稿者---tetrapod(2004/02/23 17:42:06)


なんか難しく考えすぎなのでは?2の補数って要するにたんなる負数ですよ。
符号を変更すればOK。つまり
x= -x;
だけです。


No.12904

Re:「2の補数」の算出の方法を教えて下さい
投稿者---ゆかり(2004/02/23 17:51:30)


>もう少しなのですが、ビットで1加える方法がわかりません。

ビットで1? 2進数で1を加えるという意味ですか?
2進数でも10進数でも16進数でも、1は1です。
「+1」で良いのでは?

No.12906

Re:「2の補数」の算出の方法を教えて下さい
投稿者---ポリック(2004/02/23 18:26:53)


>ビットで1? 2進数で1を加えるという意味ですか?
>2進数でも10進数でも16進数でも、1は1です。
>「+1」で良いのでは?

その通り!ただ1を足せばいいだけです。それからtetrapodさんのx = -x
すればいいというのは、2の補数の算出方法として間違いです。


この投稿にコメントする

削除パスワード

No.12910

Re:「2の補数」の算出の方法を教えて下さい
投稿者---NykR(2004/02/23 18:49:35)


>もう少しなのですが、ビットで1加える方法がわかりません。

単に + 1 するだけですが、、

どうしてもビット演算子が使いたいなら1の補数をとったあと、筆算の要領で
for (sBit = 0x01; n & sBit; n ^= sBit, sBit <<= 1)
    ;
n |= sBit;
とでもすれば良いでしょう。

符号無し整数なら nの2の補数は、単に -nとするだけで求められます。

No.12912

Re:「2の補数」の算出の方法を教えて下さい
投稿者---ポリック(2004/02/23 19:23:14)


>>ビットで1? 2進数で1を加えるという意味ですか?
>>2進数でも10進数でも16進数でも、1は1です。
>>「+1」で良いのでは?
>
>その通り!ただ1を足せばいいだけです。それからtetrapodさんのx = -x
>すればいいというのは、2の補数の算出方法として間違いです。

やっぱり2の補数を求めるにはただx=−xでよかったみたいです。
私の勘違いでした。つぐさん、tetrapodさんすみませんでしたm(_ _)m

No.12914

Re:「2の補数」の算出の方法を教えて下さい
投稿者---YuO(2004/02/23 20:47:03)


>本当に、X=−X で良いのでしょうか?

VB及びVC++を相手にしている限り単項-演算子は2の補数をとる演算子になります。
#Windows上での大抵の言語処理系は2の補数だと思う。

No.12916

Re:「2の補数」の算出の方法を教えて下さい
投稿者---NykR(2004/02/23 22:17:15)


>やっぱり2の補数を求めるにはただx=−xでよかったみたいです。

一般には、よくありません。

負数の表現は、2の補数のほかに1の補数や、単に符号ビットをセットしただけのものもあり得ます。
(JISX3010 6.2.6.2)

つまり、-n == ~nとなる処理系や、-n == 0x8000 + n となる処理系でも標準準拠ですが、これらは2の補数ではありません。

一方、符号無し整数型の場合は、「結果を符号無し整数型で表現できないときは, その型で表現しうる最大値より1だけ大きい数を法とする剰余を結果とする。(6.2.5)」ので、単項 -演算子は2の補数をとらなければなりません。

No.12919

Re:「2の補数」の算出の方法を教えて下さい
投稿者---ポリック(2004/02/24 08:43:22)


なるほど〜そうですね。勉強になりました。NykRさんありがとうございます。