投稿日 | : 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が使えればそれが一番なんですが…