可変長数値表現

出典: フリー百科事典『ウィキペディア(Wikipedia)』

可変長数値表現かへんちょうすうちひょうげん)とは、数値の値によってその表現に要する領域が変化する、数値の表現形式のひとつである。

文字列としての数値[編集]

文字(おもにアスキーコードが使われる)、ないしはBCD表現で数値の各々の桁を表現する。値の大きさを表現する方法として、数列の先頭に桁数を置く方法と、区切り文字ないしは終端コード(NUL文字がよく使われる。BCDでは0xffなどありえない値で代用する)を用いる方法がある。この表現は数値を表現する上でかなり効率が悪いが、異なる数値表現を使用するシステム間で確実に正確な値を伝達する方法として用いられる(伝達される双方のシステムがIEEE 754表現を採用してあったとしても、値を取り扱う際に有効桁外の丸め方法によっては誤差が生ずる)。いくつかのインタプリタ言語では数値を内部表現に変換せず、メモリが許す限り長精度の値を扱う実装がある。これらの言語は、例えばIEEE 754表現では扱うことが不可能な国家予算規模の数値を扱う場合に有利である。

圧縮を目的とした数値表現[編集]

数値を取り扱う際に、任意桁の数をコンパクトに表現する為の手段として可変長数値表現を使う場合がある。その実装のひとつして、Standard MIDI Fileにおける数値表現があげられる。MIDIでは使われる数値の多くが0 - 127の間にある値、すなわち7ビットでほとんどを賄うことができる。しかし、ノート長など大きな値が必要な場合には、7ビット以上の値が必要となる。そこで1オクテットのうち最上位ビットを1にした場合、続く1オクテットが値の一部となることを示すようにする。最後のオクテットで最上位ビットを0とし、可変長数値表現の区切り文字の役割を持たせる。

0 - 127
0x00 - 0x7fで表現される
128 - 16383
0x81:0x00 - 0xff:0x7fで表現される
16384 - 2097151
0x81:0x80:0x00 - 0xff:0xff:0x7fで表現される
2097152 - 268435455
0x81:0x80:0x80:0x00 - 0xff:0xff:0xff:0x7fで表現される。

このような可変長数値表現はコンパクト符号の一種でもある。このような実装は他にも、16・32bit固定長のUNICODEを可変長の1〜6バイトの数列にしたUTF-8等がある。

小数の取り扱い[編集]

小数の取り扱いについては、様々な方法がある。可変長数値表現と指数部を組み合わせたもの、小数部の桁数を定数で固定し固定小数点演算によって行うもの、小数点を示す符号(ピリオド文字)を数列に埋め込んだもの等がある。いずれも一長一短であり、可変長数値表現における小数表現の定石とされる方法はない。