16進数から10進数に変換します。$表記は小数には対応していないため、10進数表記の小数の値を変換するにはhexToDec関数 (自作関数)を使います。
- 構文
- $(16進数)
- 引数
- 戻り値
- 10進数に変換した値
16進数とは
16進数とは0〜9の10個の数字と、A〜Fの6個のアルファベット(小文字も可)の16種類の文字を使って数値を表現する方法です。
コンピュータの内部では電圧の高低を1と0(スイッチのON/OFF)に対応付けた2進数であらゆる情報を表しています。そのためコンピュータにとって2進数が便利なのですが、2進数は桁が大きくなりすぎるため人間にとっては扱いづらい表現です。16進数だと1桁が4bitとビット数自体が\(2^{n}\)という形式になり便利なため、コンピュータで数値を扱うときには16進数がよく使われます。例えば、Web開発でカラーコードは#(シャープ)の後に数字6桁で#FF5733、文字コードは0x41のような16進数で表現されます。
10進数では一つの桁において0~9の10種類の文字を扱うことができるのに対し、16進数では0、1、2、3、4、5、6、7、8、9、A、B、C、 D、E、Fの16種類の文字を扱うことができます。
1から9までは10進数と同じ数値ですが、AからFは10から15に対応しています。
10進数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
16進数 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 10 |
10進数では0,1,2,…,7,8,9と1桁で表現できる上限まで来ると10と桁が増えるように、16進数も0,1,2,…,D,E,Fの次は10と桁が上がります。このとき10はジュウではなく、イチゼロと読みます。
また10進数と16進数など複数の基数表記がある場合、例えば10が10進数のジュウなのか16進数のイチゼロなのかの区別がつきません。そのため以下の表に示すような接頭辞・接尾辞のいずれかをつけることで区別します。基数とは位取り記数法で数値を書き記す際に各桁の重み付けの基本となる数のことで10進数では10、16進数では16です
進数 | 2進数 | 8進数 | 10進数 | 16進数 |
---|---|---|---|---|
接頭辞 | 0b | 0oもしくは0 | 0d | 0x |
接尾辞 | b | o | d | h |
例えば0x10や10hというように書けば16進数の10、0d10や10dと書けば10進数の10というように何進数の表記なのかが明確になります。10進数のときは接頭辞・接尾辞を省略することもあります。
接頭辞・接尾辞のアルファベットはそれそれBinary(2進数)、Octal(8進数)、Decimal(10進数)、Hexadecimal(16進数)の頭文字から来ています。16進数の接頭辞のみheXadecimalと3文字目のxです。
ただし接尾辞のbやdは16進数の値との区別がつかなくなることがあるので、接頭辞を使うのをおすすめします。
右下に基数を小さく添え字として書く方法もありますが、この表記は数学で使われることがあってもプログラミングで使われることはあまりありません。
例えば\(1011_{2}\)は2進数の1011、\(13_{10}\)は10進数の13、\(5F_{16}\)は16進数の5Fのようになります。
使い方
16進数の0x5、0xA、0x1F、0xFFをそれぞれ10進数に変換します。
PRINT $5
PRINT $A
PRINT $1F
PRINT $FF
- 結果
5 10 31 255
表現できる範囲
$を使って表現できるのは、符号付き64bitの整数である-9,223,372,036,854,775,808~+9,223,372,036,854,775,807の範囲の数値です。(-922京3372兆0368億5477万5808〜922京3372兆0368億5477万5807)。
PRINT "最大値:" + $7FFFFFFFFFFFFFFF
PRINT "最小値:" + $8000000000000000
- 結果
最大値:9.22337203685478E18 最小値:-9.22337203685478E18
先頭の1bitは符号を表すために使われるので63bitが数値を表し、\(-2^{63}\)〜\(2^{63}-1\)の範囲となります。
符号ビット
最上位ビット が符号を表す符号ビットです。64bitなので16進数だと右から16桁目になります。2進数にしたとき0(16進数で0~7)であれば正数、1(16進数で8~F)であれば負数となります。
0x80は64bitで表記すると0x0000000000000080となり最上位ビットが0なので正数となります。
PRINT $80
PRINT $0000000000000080
- 結果
128 128
最上位ビットを省略すると0埋めされて正数になるので、負数を表現するには以下のように16桁で表現します。
PRINT $FFFFFFFFFFFFFFFF
PRINT $FFFFFFFFFFFFFFFE
PRINT $FFFFFFFFFFFFFFFD
- 結果
-1 -2 -3
計算
16進数同士
結果は10進数で返されます。
PRINT $F + $E // 15 + 14
PRINT $10 + $FFFFFFFFFFFFFFFA // 16 + (-6)
- 結果
29 10
16進数と10進数
16進数と10進数の値が混在していても、計算することができます。こちらも結果は10進数で返ります。
PRINT $F3 + 150 // 243 + 150
- 結果
393
16進数に変換するにはFORMAT関数 (スクリプト関数)を使います。第1引数に16進数に変換する値、第3引数に-1を指定します。
DIM dec = $F3 + 150
PRINT FORMAT(dec,, -1)
- 結果
189
decToHex関数 (自作関数)でも16進数に変換できます。最上位ビットで符号の判断をしているので先頭に0が入ることがあります。
PRINT decToHex($F3+150)
- 結果
0189
関連記事
- hexToDec関数 (自作関数)
- 16進数を10進数に変換します。負数・小数の値にも対応しています。
- decToHex関数 (自作関数)
- 10進数を16進数に変換します。負数・小数の値にも対応しています。
- binToHex関数 (自作関数)
- 2進数を16進数に変換します。負数・小数の値にも対応しています。
- hexToBin関数 (自作関数)
- 16進数を2進数に変換します。負数・小数の値にも対応しています。
- decToBin関数 (自作関数)
- 10進数を2進数に変換します。負数・小数の値にも対応しています。
- binToDec関数 (自作関数)
- 2進数を10進数に変換します。負数・小数の値にも対応しています。