VB6.0用掲示板の過去のログ(No.2)−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が使えればそれが一番なんですが…


- 関連一覧ツリー (★ をクリックするとツリー全体を一括表示します)

- 返信フォーム (この記事に返信する場合は下記フォームから投稿して下さい)

- VBレスキュー(花ちゃん) - - Web Forum -