32bitを16bitずつにわけるには?

解決


からくり  2005-12-12 22:18:32  No: 128813

すみませんが、質問させてください。

現在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) & "&")

上記だと何か強引に合わせた感じがします・・・。
なにか、間違ってますかね?すみませんが、宜しくお願いします。


魔界の仮面弁士  2005-12-12 22:33:57  No: 128814

> 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&
のように、リテラルの最後に & を付与する必要があります。


からくり  2005-12-12 23:05:41  No: 128815

魔界の仮面弁士さん、すばやい対応ありがとうございます。

>、("&H0000FFFF" ではなく) "&HFFFFFFFF" として処理されてしまっているわけです。

なるほど!そういうわけでしたか。
納得です。

>Long型を明示するために、&HFFFF&
こう書くことによって、Long型を明示しているんですね^^;
知らずにちょこっと使ってました・・

まことに助かりました、ありがとうございます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加