正の整数の足し算(8ビット)

8ビット演算装置による正の整数の足し算

8ビットで正の整数だけ扱うときには 0 から 255 までを表現できました。これを2つ用意して足し算をします。

8ビットでは計算結果が 0 以上 255 以下ならば正しい答が出ます。

それを越すと正しい答えになりません。その様子を観察してください。

内部表現 符号なし整数
(十進数)
0 0 0 0 0 0 0 0 0
+) 0 0 0 0 0 0 0 0 0
計算値 正しい値

内部表現の薄い青の背景色部分のビットをクリックして数値を設定し、[加算実行]で和を求めます。

もう少し少なめの数で十分なときは4ビットを見てください。

結果の表です。

コンピュータの
内部表現
計算値 正しい値
11111010250250
11111011251251
11111100252252
11111101253253
11111110254254
11111111255255
1000000000256
1000000011257
1000000102258
1000000113259
1000001004260
1000001015261
1000001106262
1000001117263
1000010008264
1000010019265

プログラムなど

詳しい説明は4ビットを見てください。

Javascript

<script>
var na=0;
var nb=0;
var bits = 8;
function flip(e){
  var bit = e.firstChild.nodeValue;
  if ( bit == 0 ){
     bit = 1;
  }else{
     bit = 0;
  }
  e.firstChild.nodeValue = bit;
  disp();
}
function disp(){
   var tgt = document.getElementById("cala");
   var tgttd = tgt.getElementsByTagName("td");
   var bstr = "";
   for (var i=1;bits>=i;i++){ 
      bstr += tgttd[i].firstChild.nodeValue;
   }
   na = parseInt(bstr,2);
   tgttd[bits+1].firstChild.nodeValue = na.toString(10);

   tgt = document.getElementById("calb");
   tgttd = tgt.getElementsByTagName("td");
   bstr = "";
   for (var i=1;bits>=i;i++){ 
      bstr += tgttd[i].firstChild.nodeValue;
   }
   nb = parseInt(bstr,2);
   tgttd[bits+1].firstChild.nodeValue = nb.toString(10);

   tgt = document.getElementById("calc");
   tgttd = tgt.getElementsByTagName("td");
   bstr = "";
   for (var i=1;tgttd.length>i;i++){ 
      tgttd[i].firstChild.nodeValue = " ";
      tgttd[bits+1].style.backgroundColor = "#ffffff";
   }
}
function doadd(){
   var nsum = na + nb;
   var tgt = document.getElementById("calc");
   var tgttd = tgt.getElementsByTagName("td");
   
   var bstr = "0000000" + nsum.toString(2);
   bstr = bstr.substring(bstr.length-bits);
   for (var i=1;bits>=i;i++){ 
      tgttd[i].firstChild.nodeValue = bstr.substring(i-1,i);
   }
   var bgcolor = "#ffffff";
   var nc = parseInt(bstr,2);
   if (nsum != nc){
      bgcolor = "#ffcccc";
   }
   tgttd[bits+1].firstChild.nodeValue = nc.toString(10);
   tgttd[bits+1].style.backgroundColor = bgcolor;
   tgttd[bits+2].firstChild.nodeValue = nsum.toString(10);
}
window.onload = function() {
  setlistner();
}
function setlistner(){
   var tgt = document.getElementById("cala");
   var tgttd = tgt.getElementsByTagName("td");
   for (var i=1;bits>=i;i++){ 
      tgttd[i].onclick = function(){flip(this);}
      tgttd[i].className = "bittd";
   }
   tgt = document.getElementById("calb");
   tgttd = tgt.getElementsByTagName("td");
   for (var i=1;bits>=i;i++){ 
      tgttd[i].onclick = function(){flip(this);}
      tgttd[i].className = "bittd";
   }
   tgt = document.getElementById("calc");
   tgttd = tgt.getElementsByTagName("td");
   for (var i=1;bits>=i;i++){ 
      tgttd[i].className = "anstd";
   }
}
</script>

html部分

<table id="addtbl">
<tr>
<th></th>
<th colspan="8">内部表現</th>
<th>符号なし整数<br>(十進数)</th>
<th></th>
</tr>
<tr id="cala">
<td></td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td> </td>
</tr>
<tr id="calb">
<td>+)</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td>0</td>
<td> </td>
</tr>
<tr id="calc">
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<tr>
<td> </td>
<td class="incdec" colspan="8">
<button type="button" onclick="doadd()">加算実行</button>
</td>
<td class="info">計算値</td>
<td class="info">正しい値</td>
</tr>
</table>

css部分

#addtbl{ 
  margin:1% 2%;
  border:none;
  border-collapse:collapse;
}
#addtbl td, #addtbl th{
  border:none;
}
#cala td, #calb td, #calc td{
  font-family:courier,monospace;
  font-size:200%;
  text-align :right;
  padding:2px 8px;
  height:1.5em;
}
td.incdec{
  padding:16px 2px 1px 2px;
  text-align :center;
}
td.info{
  padding-left:1em;
  text-align :right;
}
#addtbl td.bittd{
  cursor:pointer;
  border:solid 1px #999999;
  background-color:#f0f0ff;
}
#addtbl td.anstd{
  border:solid 1px #999999;
}
#addtbl tr#calc{
  border-top:solid 1px #999999;
}
button{
  cursor:pointer;
  min-width:5em;
}