[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2007/02/23(Fri) 12:35
投稿者名:戸豚
Eメール:
URL :
タイトル:
異なる型へのマスクと代入でオーバーフローが起こる
お知恵を拝借できませんでしょうか

VB6.0 SP5で次のようなプロシージャで、Long型変数の下位16ビットをInteger型変数に代入しようとしています。
ですが、Long型変数が32768以上になるとオーバーフローを起こします。

Sub Function getLowWord(ByVal lDword as long) as Integer
  Dim iWork as Integer
  iWork = &HFFFF& and lWord
  getLowWord = iWork
End Sub

この回避策で&H8000と&H7FFFで2度別な変数にマスクして&H8000の結果でそのまま代入するかマイナス値にするかとしているのですが見た目がよくありません。
できるだけ簡素な記述ができる方法はないでしょうか?

Sub Function getLowWord(ByVal lDword as long) as Integer
 'オーバーフロー対策版
  Dim iWorkH as Integer
  Dim iWorkL as Integer
  iWorkH = &H8000& and lWord
  iWorkL = &H7FFF& and lWord
  getLowWord = iWorkL Or (-iWorkH)
End Sub

符号なしのIntegerが使えればそれが一番なんですが…

投稿時間:2007/02/23(Fri) 14:39
投稿者名:y4yama
Eメール:
URL :
タイトル:
Re: 異なる型へのマスクと代入でオーバーフローが起こる
> VB6.0 SP5で次のようなプロシージャで、Long型変数の下位16ビットをInteger型変数に代入しようとしています。
> 符号なしのIntegerが使えればそれが一番なんですが…
VB6では望めないですよねぇ〜

Integer型変数として何に使うのか、問題ですが、「Longにすることを強く」お勧めします。
一応、
getLowWord = CInt("&H" & (Hex(&HFFFF& And lDword)))
で(マイナスも)返りますが・・やめておいたほうが・・

投稿時間:2007/02/23(Fri) 16:34
投稿者名:戸豚
Eメール:
URL :
タイトル:
Re^2: 異なる型へのマスクと代入でオーバーフローが起こる
y4yamaさん、ありがとう御座います。

> VB6では望めないですよねぇ〜

やっぱりできないですか…

> Integer型変数として何に使うのか、問題ですが、「Longにすることを強く」お勧めします。
> 一応、

質問したプロシージャはTCP/IP通信の絡みのツールで Long型→Byte型配列 の変換処理をしてる一部です。
ロジックを練りこんでないってのもありますが、Integer型→Byte型配列変換を利用しようとしたので、こんなコトをしてます。

> getLowWord = CInt("&H" & (Hex(&HFFFF& And lDword)))
> で(マイナスも)返りますが・・やめておいたほうが・・

変換使えば1行なんですね。
目から鱗…盲点でした。