「BCD命令」の版間の差分
Administrator (トーク | 投稿記録) ページの作成:「'''BCD命令'''とは、BCD形式(Binary Coded Decimal:二進化十進数)のデータに対して演算や変換を行う命令の総称です。 コンピューターで数値を扱う場合、よくあるのは「1バイトで0から255の数値を表す方式」です。昨今のプログラミングの教科書にはその方法しか書かれていないことが一般的です。 一方、BCD形式では「1バイトで0から9までの数…」 |
Administrator (トーク | 投稿記録) 編集の要約なし |
||
| 5行目: | 5行目: | ||
一方、BCD形式では「1バイトで0から9までの数字」を表します。つまり人間が見やすい10進数表現のまま[[メモリ]]に格納しています。ちなみにメモリ節約のため「4ビットで1桁」を表す[[パックドBCD]]という方式の方が一般的でした。 | 一方、BCD形式では「1バイトで0から9までの数字」を表します。つまり人間が見やすい10進数表現のまま[[メモリ]]に格納しています。ちなみにメモリ節約のため「4ビットで1桁」を表す[[パックドBCD]]という方式の方が一般的でした。 | ||
BCD形式は人間が見やすいという利点に加えて、BCD命令では「桁数を指定して演算できる」という特徴がありました。昨今の[[プログラミング言語]]でいえば[[関数]]の[[引数]]にbyte型の[[配列]]と桁数を指定するイメージです。 | |||
<source lang=c> | <source lang=c> | ||
byte[] add(byte[] a, byte[] b, int digits) | |||
{ | |||
byte[] result = new byte[digits]; | |||
int carry = 0; | |||
for (int i = digits - 1; i >= 0; i--) | |||
{ | |||
int sum = (a[i] & 0x0F) + (b[i] & 0x0F) + carry; | |||
if (sum > 9) | |||
{ | |||
sum = sum - 10; | |||
carry = 1; | |||
} | |||
else | |||
{ | |||
carry = 0; | |||
} | |||
result[i] = (byte)sum; | |||
} | |||
return result; | |||
} | |||
</source> | </source> | ||
2025年9月18日 (木) 09:45時点における版
BCD命令とは、BCD形式(Binary Coded Decimal:二進化十進数)のデータに対して演算や変換を行う命令の総称です。
コンピューターで数値を扱う場合、よくあるのは「1バイトで0から255の数値を表す方式」です。昨今のプログラミングの教科書にはその方法しか書かれていないことが一般的です。
一方、BCD形式では「1バイトで0から9までの数字」を表します。つまり人間が見やすい10進数表現のままメモリに格納しています。ちなみにメモリ節約のため「4ビットで1桁」を表すパックドBCDという方式の方が一般的でした。
BCD形式は人間が見やすいという利点に加えて、BCD命令では「桁数を指定して演算できる」という特徴がありました。昨今のプログラミング言語でいえば関数の引数にbyte型の配列と桁数を指定するイメージです。
byte[] add(byte[] a, byte[] b, int digits)
{
byte[] result = new byte[digits];
int carry = 0;
for (int i = digits - 1; i >= 0; i--)
{
int sum = (a[i] & 0x0F) + (b[i] & 0x0F) + carry;
if (sum > 9)
{
sum = sum - 10;
carry = 1;
}
else
{
carry = 0;
}
result[i] = (byte)sum;
}
return result;
}
BCD命令はInt32やInt64のような大きな数値型が標準でなかった8ビットCPUの時代に大きな数値を手軽に扱いたい場合に重宝されました。