負数の表現 | ITパスポート家庭教師のつぶやき

負数の表現

負数の表現


いままでは正数(0より大きい実数)の基数変換を説明してきました。


今回は負数(0より小さい実数)の説明です。ニコニコニコニコ


負数は面倒で。。汗


いくつか表現方法がありますが、代表的な2つを紹介します。



【記号付表現】


 先頭ビットを負の記号として負数を扱います。


1バイトの場合



 例)-1(2進)


 10000001
 ↑
 先頭ビットは符号として使用し、1のときは負数を表す。



 例)-127(2進)


 11111111


じゃあ、正数はとなると


 例)127(2進)
 
 01111111
 ↑
 先頭ビットは符号として使用し、0のときは正数を表す。


となります。



整理してます。コーヒー



1バイトで先頭符号としたビット列で扱える数値範囲


正数


 00000000(2進) ~ 01111111(2進)

 範囲:0~127


負数


 10000000(2進) ~ 11111111(2進)

 範囲:0~-127



先頭が符号ですから意外とわかり易いですね。ニコニコ



つぎは。



【補数】


2進数であれば、2の補数(ほすう)といい。


負数をある規則で表現します。


補数で表現すると以下の特徴が発生いたします。メモ


「引き算も足し算もすべて足し算で計算することができる」のです!?



不思議ですね。


意味わかりませんね。




では、見て行きましょう。ニコニコ




まずは表現方法です。



【2の補数へ変換】


 1.負数を正数でビット列に表現します。


  例)-1(2進)


   正数として表現します。
  
   1(2進)→ 0001(2進)


 2.ビットを反転します。


  例)0001(2進)


   ビット反転(0→1、1→0)します。
  
   0001(2進)→ 1110(2進)


 3.1を加算します。


  例)1110(2進)


   1を足します。
  
   1110(2進)→ 1111(2進)


 -1(2進)を2の補数で表現すると、「1111」となります。


 もとに戻す方法を説明しておきます。
 


【2の補数から戻す】(2の補数の絶対値)


 2の補数の変換手順を逆に行えばもとに戻すことができます。


 1.2の補数kら-1します。


  例)マイナス1します。


   1111(2の補数)→ 1110(2進)


 2.ビットを反転します。


  例)1110(2進)


   ビット反転(0→1、1→0)します。
  
   1110(2進)→ 0001(2進)


 ほら、1111(2の補数)は0001(2進)に変換でき、1(10進)にできました。




では




「引き算も足し算もすべて足し算で計算することができる」のですから試してみましょう。



【ケース1】


 1+-1=0を試します。


 1(10進)→ 0001(2進)

 -1(10進)→ 1111(2進)


 では、足します。

   0001
 +)1111
  -----
  10000 


 10000となりました。


 ん!?4ケタだったのに5ケタにケタ上げされてますね。。。

 そう、補数での計算では、以下のルールがあります。

 「ケタ上げしたは切り捨てる」のです。


 もともと4ケタでしたから、5ケタ目を捨てます。

 10000 → 0000 

 ほら、1+-1=0 になりましたね。




【ケース2】
 
 -1+-1=-2を試します。


 -1(10進)→ 1111(2進)

 -1(10進)→ 1111(2進)


 では、足します。

   1111
 +)1111
  -----
  11110 


 11110となりました。


 ん!?またまた4ケタだったのに5ケタにケタ上げされてます。

 「ケタ上げしたは切り捨てる」ので

 もともと4ケタでしたから、5ケタ目を捨てます。

 11110 → 1110 


 1110(2進2の補数)になりました。

 では、検算してみます。

 2の補数を戻す(検算)する方法は 「2の補数の手順を逆にすればいい」ので。
 
 1110(2の補数)→ マイナス1します → 1101 → 反転します → 0010

 1110(2の補数)の絶対値は、0010(2進)=2(10進)となり


 またまた -1+-1=-2 が計算できました。


ずいぶん、長文となりましたが(;´▽`A``


まずは「負数表現には、符号と補数がある」と覚えておいてください。


(^O^)/