こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

VB6.0で、LSetの動作がわからない

よろしくお願いします。

LSetのサンプルを検索していて以下のコードを見つけました。

Option Explicit

Private Type B4
B(3) As Byte
End Type

Private Type S1
S As Single
End Type

Private Sub Form_Load()
Dim X As B4
Dim Y As S1

X.B(0) = 37
X.B(1) = 82
X.B(2) = 154
X.B(3) = 68

LSet Y = X

Debug.Print Y.S
End Sub

このコードを実行するとデバッグウィンドウに
1234.567
と表示されます。
このコードではいったい何が起こっているのでしょうか?
X.Bとして4つの配列変数が用意され、それがY.Sという配列ではない通常の変数に代入されているのはわかるのですが、
どうして結果が1234.567になるのかわかりません。

投稿日時 - 2005-11-28 19:37:07

QNo.1807318

困ってます

質問者が選んだベストアンサー

LSetでユーザ定義型をコピーすると単にメモリ領域がコピーされます。
つまり4つのバイトを浮動小数(Single)として解釈するという意味になります。
32ビットの浮動小数は
符号1ビット、指数部8ビット(127のゲタ履き)、仮数部23ビット(最左のビット省略)
の様に表されます。
つまり、
1234.567
は、
2進数で表現すると
01000100 10011010 01010010 00100101
で、コレをバイト区切りで
10進数にすると
68 154 82 37
になります。
01000100 10011010 01010010 00100101
を先程の、浮動小数の定義にそって区切るとすると
0 10001001 (1:省略されているビット)00110100101001000100101
になります。
先頭の0は、符号が正
次の
10001001は、137で、137-127で、ビットが10ビット左シフトされることを示しています
仮数部
00110100101001000100101
は、
1.00110100101001000100101
で、この小数点位置を10桁ずらすと
10011010010.1001000100101
小数でない部分
10011010010 は
10進で1234
小数部は、
1001000100101
1/2+1/16+1/256+1/2048+1/8192
=0.5670166015625
ということになります

投稿日時 - 2005-11-28 20:57:26

お礼

ありがとうございます・・・ここまで丁寧に教えていただきありがとうございます。

投稿日時 - 2005-11-28 22:30:25

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問