はじめに
前回の記事で日本語プログラミング言語Mindで固定小数点計算機能を書いてみました。小数点位置は4桁固定の64bit通貨型に相当する機能で、Mind8の64bit倍精度整数変数の四則演算を拡張して実現しています。
64bit倍精度整数変数の初期化処理と64bit通貨変数は数字の文字列から初期化していますが、バイト幅の狭い整数型変数または数値を代入することでも初期化できるとうれしいので、そのあたりの挙動を調べてみました。
前提条件
Windows11 Pro 22H2
VSCode(Visual Studo Code) 1.86.1
Microsoft Visual C++ 2008 Express Edition
Mind Version 7.5 for Windows
Mind Version 8.07 for Windows
MindはMind8のバージョンのパスが構成されていることを前提とします。もしも本記事の内容をお試ししたい場合は辞書修正ツールでMind7のライセンスが必要となりますのでご注意ください。今回はMind8側だけの実装となります。
VSCodeの拡張機能
C/C++ for Visual Studio Code 1.18.5 Microsoft
C/C++ Extension Pack 1.3.0 Microsoft
C/C++のデバッガはMind8のCカーネルアプリケーションをデバッグ実行するために使用しています。今回はMind側だけの実装となります。
お題のソースコード Mind
とりあえず今回もメイン付きのアプリケーションとして実装しています。
8bit、16bit、32bit整数変数の(前2者は符号付と仮定した場合の)最大値と最小値で初期化し、それらの変数を64bit倍精度整数変数に代入して、16進数表示して、64bit倍精度整数変数を同じ値で文字列初期化した場合の結果と比較します。
int8は バイト変数。
int16は ワード変数。
int32は 変数。
int64は 倍精度変数。
メインは
127を int8に 入れ int8を クアド表示2し " "を 表示し int8を 数値表示し 改行し
int8を int32に 入れ int32を クアド表示2し " "を 表示し int32を 数値表示し 改行し
int8を int64に 入れ int64を クアド表示2し " "を 表示し int64を $$倍精度表示し 改行し
"127"を q文字列初期化し int64に 入れ int64を クアド表示2し " "を 表示し int64を $$倍精度表示し 改行し
-128を int8に 入れ int8を クアド表示2し " "を 表示し int8を 数値表示し 改行し
int8を int32に 入れ int32を クアド表示2し " "を 表示し int32を 数値表示し 改行し
int8を int64に 入れ int64を クアド表示2し " "を 表示し int64を $$倍精度表示し 改行し
"-128"を q文字列初期化し int64に 入れ int64を クアド表示2し " "を 表示し int64を $$倍精度表示し 改行し
改行し
32767を int16に 入れ int16を クアド表示2し " "を 表示し int16を 数値表示し 改行し
int16を int32に 入れ int32を クアド表示2し " "を 表示し int32を 数値表示し 改行し
int16を int64に 入れ int64を クアド表示2し " "を 表示し int64を $$倍精度表示し 改行し
"32767"を q文字列初期化し int64に 入れ int64を クアド表示2し " "を 表示し int64を $$倍精度表示し 改行し
-32768を int16に 入れ int16を クアド表示2し " "を 表示し int16を 数値表示し 改行し
int16を int32に 入れ int32を クアド表示2し " "を 表示し int32を 数値表示し 改行し
int16を int64に 入れ int64を クアド表示2し " "を 表示し int64を $$倍精度表示し 改行し
"-32768"を q文字列初期化し int64に 入れ int64を クアド表示2し " "を 表示し int64を $$倍精度表示し 改行し
改行し
2147483647を int32に 入れ int32を クアド表示2し " "を 表示し int32を 数値表示し 改行し
int32を int64に 入れ int64を クアド表示2し " "を 表示し int64を $$倍精度表示し 改行し
"2147483647"を q文字列初期化し int64に 入れ int64を クアド表示2し " "を 表示し int64を $$倍精度表示し 改行し
-2147483648を int32に 入れ int32を クアド表示2し " "を 表示し int32を 数値表示し 改行し
int32を int64に 入れ int64を クアド表示2し " "を 表示し int64を $$倍精度表示し 改行し
"-2147483648"を q文字列初期化し int64に 入れ int64を クアド表示2し " "を 表示し int64を $$倍精度表示し 改行し
。
実行結果
コンパイルはこの記事の倍精度変数四則演算のオーバフローチェック付き版のfileライブラリでビルドします。
PS C:\developments\vscode\mind8\bin> mind ..\sample\varinit ..\lib\file
日本語プログラミング言語 Mind Version 8.07 for Windows
Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. c:\pmind\bin\mindex.exe --> ..\sample\varinit.exe
PS C:\developments\vscode\mind8\bin> ..\sample\varinit
000000000000007f 127
000000000000007f 127
000000000000007f 127
000000000000007f 127
0000000000000080 128
0000000000000080 128
0000000000000080 128
ffffffffffffff80 -128
0000000000007fff 32767
0000000000007fff 32767
0000000000007fff 32767
0000000000007fff 32767
0000000000008000 32768
0000000000008000 32768
0000000000008000 32768
ffffffffffff8000 -32768
000000007fffffff 2147483647
000000007fffffff 2147483647
000000007fffffff 2147483647
0000000080000000 -2147483648
0000000080000000 2147483648
ffffffff80000000 -2147483648
Mindの「バイト変数」と「ワード変数」はそれぞれ符号なしの8bit整数変数、16bit整数変数であるため、符号付きのマイナス側最小値相当を代入しても符号付きの場合の最大値の+1の値になります。これは符号付き32bit整数の「変数」へ、これより低バイト幅の整数変数を代入初期化した場合も同様でした。
今回は符号付き32bit整数の「変数」との比較のためマイナス値を入れていますが、これらの変数の場合は符号なしなので、符号なしの最大値までは問題なく初期化できます。
32bit整数の「変数」の場合も符号付き最大値側までは問題なく倍精度変数を初期化できました。問題はマイナス値の場合ですが、この場合は符号が取れた状態となるようでした。
おわりに
とりあえずマイナス値の32bit変数を代入して倍精度変数を初期化するためにはなんらかの拡張処理単語を介して符号をつけて初期化する必要があることが確認できました。