Mind8で倍精度整数変数への8bit、16bit、32bit整数変数の代入を調査する

# はじめに
[前回の記事](https://qiita.com/mylifewithviolin/items/a9cd528ce1031a28f13c)で日本語プログラミング言語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整数変数の（前２者は符号付と仮定した場合の）最大値と最小値で初期化し、それらの変数を64bit倍精度整数変数に代入して、16進数表示して、64bit倍精度整数変数を同じ値で文字列初期化した場合の結果と比較します。

```mind:varinit.src
int8は　バイト変数。
int16は　ワード変数。
int32は　変数。
int64は　倍精度変数。

メインは
127を　int8に　入れ　int8を クアド表示2し　" "を　表示し int8を　数値表示し　　改行し
int8を　int32に　入れ　int32を クアド表示2し　" "を　表示し int32を　数値表示し　　改行し
int8を　int64に　入れ　int64を クアド表示2し　" "を　表示し int64を　＄＄倍精度表示し　　改行し
"127"を　ｑ文字列初期化し　int64に　入れ　int64を クアド表示2し　" "を　表示し int64を　＄＄倍精度表示し　　改行し
-128を　int8に　入れ　int8を クアド表示2し　" "を　表示し int8を　数値表示し　　改行し
int8を　int32に　入れ　int32を クアド表示2し　" "を　表示し int32を　数値表示し　　改行し
int8を　int64に　入れ　int64を クアド表示2し　" "を　表示し int64を　＄＄倍精度表示し　　改行し
"-128"を　ｑ文字列初期化し　int64に　入れ　int64を クアド表示2し　" "を　表示し int64を　＄＄倍精度表示し　　改行し
　改行し
 
32767を　int16に　入れ　int16を クアド表示2し　" "を　表示し int16を　数値表示し　　改行し
int16を　int32に　入れ　int32を クアド表示2し　" "を　表示し int32を　数値表示し　　改行し
int16を　int64に　入れ　int64を クアド表示2し　" "を　表示し int64を　＄＄倍精度表示し　　改行し
"32767"を　ｑ文字列初期化し　int64に　入れ　int64を クアド表示2し　" "を　表示し int64を　＄＄倍精度表示し　　改行し
-32768を　int16に　入れ　int16を クアド表示2し　" "を　表示し int16を　数値表示し　　改行し
int16を　int32に　入れ　int32を クアド表示2し　" "を　表示し int32を　数値表示し　　改行し
int16を　int64に　入れ　int64を クアド表示2し　" "を　表示し int64を　＄＄倍精度表示し　　改行し
"-32768"を　ｑ文字列初期化し　int64に　入れ　int64を クアド表示2し　" "を　表示し int64を　＄＄倍精度表示し　　改行し
　改行し
 
2147483647を　int32に　入れ　int32を クアド表示2し　" "を　表示し int32を　数値表示し　　改行し
int32を　int64に　入れ　int64を クアド表示2し　" "を　表示し int64を　＄＄倍精度表示し　　改行し
"2147483647"を　ｑ文字列初期化し　int64に　入れ　int64を クアド表示2し　" "を　表示し int64を　＄＄倍精度表示し　　改行し
-2147483648を　int32に　入れ　int32を クアド表示2し　" "を　表示し int32を　数値表示し　　改行し
int32を　int64に　入れ　int64を クアド表示2し　" "を　表示し int64を　＄＄倍精度表示し　　改行し
"-2147483648"を　ｑ文字列初期化し　int64に　入れ　int64を クアド表示2し　" "を　表示し int64を　＄＄倍精度表示し　　改行し
。
```

## 実行結果
コンパイルは[この記事](https://qiita.com/mylifewithviolin/items/a9cd528ce1031a28f13c)の倍精度変数四則演算のオーバフローチェック付き版のfileライブラリでビルドします。
```
PS C:\developments\vscode\mind8\bin> mind ..\sample\varinit ..\lib\file

日本語プログラミング言語 Ｍｉｎｄ 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変数を代入して倍精度変数を初期化するためにはなんらかの拡張処理単語を介して符号をつけて初期化する必要があることが確認できました。