すみませんが、質問させてください。
現在VB6.0を使用しているのですが、
32bitのデータを上位(16bit)と下位(16bit)のデータに分ける
方法で困っています。(全て10進数で取得)
16bitのデータを上位(8bit)と下位(8bit)のデータに分ける事は
下記ソースで出来た?のですが、
Dim i16bit As Integer
Dim Hibit As Integer
Dim Lobit As Integer
Hibit = (i16bit And &HFF00) / &H100
Lobit = i16bit And &HFF
32bitのデータを上位(16bit)と下位(16bit)のデータに分ける事が出来ません。
下記ソース
Dim i32bit As Long
Dim Hibit As Integer
Dim Lobit As Integer
Hibit = (i32bit And &HFFFF0000) / &H10000
Lobit = i32bit And &HFFFF
Hibitは、うまくいくのですが、Lobitが32bit分取得してしまいます。
何か致命的なミスがありそうですが、助言よろしくおねがいします。
ちなみに以下のように取得した場合なんとかそれらしくできますが、
ソース上きびしいですかね;;
Dim i32bit As Integer
Dim sTemp As String
Dim Hibit As Integer
Dim Lobit As Integer
sTemp = Replace(Format(Hex(i32bit), "@@@@@@@@"), " ", "0")
Lobit = Val("&H" & Mid(sTemp, 5) & "&")
Hibit = Val("&H" & Mid(sTemp, 1, 4) & "&")
上記だと何か強引に合わせた感じがします・・・。
なにか、間違ってますかね?すみませんが、宜しくお願いします。
> Hibit = (i32bit And &HFFFF0000) / &H10000
> Lobit = i32bit And &HFFFF
データ型の違いですね。『MsgBox TypeName(&HFFFF)』を実行して
みてください。"Long" ではなく、"Integer" と表示されるはずです。
&HFFFF の値は、そのままでは -1 として扱われますよね。
それを Long型との And 演算に用いているわけですから、Long への
暗黙の型変換が発生し、("&H0000FFFF" ではなく) "&HFFFFFFFF" として
処理されてしまっているわけです。
これを避けるためには、CLng関数を用いて
CLng("&HFFFF")
のように書くか、もしくは、Long型を明示するために、
&HFFFF&
のように、リテラルの最後に & を付与する必要があります。
魔界の仮面弁士さん、すばやい対応ありがとうございます。
>、("&H0000FFFF" ではなく) "&HFFFFFFFF" として処理されてしまっているわけです。
なるほど!そういうわけでしたか。
納得です。
>Long型を明示するために、&HFFFF&
こう書くことによって、Long型を明示しているんですね^^;
知らずにちょこっと使ってました・・
まことに助かりました、ありがとうございます。
ツイート | ![]() |