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ビットを見てください。
結果の表です。
コンピュータの 内部表現 |
計算値 | 正しい値 |
---|---|---|
11111010 | 250 | 250 |
11111011 | 251 | 251 |
11111100 | 252 | 252 |
11111101 | 253 | 253 |
11111110 | 254 | 254 |
11111111 | 255 | 255 |
100000000 | 0 | 256 |
100000001 | 1 | 257 |
100000010 | 2 | 258 |
100000011 | 3 | 259 |
100000100 | 4 | 260 |
100000101 | 5 | 261 |
100000110 | 6 | 262 |
100000111 | 7 | 263 |
100001000 | 8 | 264 |
100001001 | 9 | 265 |
詳しい説明は4ビットを見てください。
<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>
<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>
#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; }