アプリ版:「スタンプのみでお礼する」機能のリリースについて

VB2008を使っています。
10進を2進(16ビット)に変換するプログラムがあったので、
それを利用して32ビット対応にしたいのですが、
以下のプログラムの☆☆の位置でオーバーフローが発生してしまします。解決法をぜひ教えてください!!
wave1は配列で、数字データが格納されています。

100
29584
12
489


ここで、このデータを2進(32ビット)に変換し、
wave2という新しい配列に格納したいです。

Public Class Form1
(一部省略)
  Const WD As Long = 300000
Private wave1(WD) As Integer
  Private wave2(WD) As Long
(一部省略)

For i = 0 To 10
dec2bit = dec(wave1(i)) ☆☆ここでオーバーフロー発生
wave2(i) = dec2bit
Next


Private Function dec(ByRef decNum0 As Integer)
Dim i As Integer
Dim ret As Long
Dim decNum As Long
Dim dec2bit As String

If decNum0 >= 0 Then
'正、0はそのままセット
decNum = decNum0
Else
'負のときは、そのビットイメージをセット(例-1なら4294967296)
decNum = 4294967296 + decNum0
End If
dec2bit = ""
'文字列を作成
For i = 1 To 32
'最上位ビット(最も左側のビット)が1か0か判定
ret = decNum And 2147483648 '2147483648は符号無しの&H80000000に相当
If ret <> 0 Then
dec2bit = dec2bit & "1"
Else
dec2bit = dec2bit & "0"
End If
'左へ1ビットシフトする
'シフト演算子
decNum = decNum << 1
'オーバーフロー防止
If decNum >= 4294967296 Then
decNum = decNum - 4294967296
End If
Next
Return dec2bit
End Function
End Class

A 回答 (1件)

'残念ながらエラーが再現できない。

正常に動作する。(試した範囲ではConvert.toStringと同じ値を返している)
'以下のソースは質問文のものから多少改変している。

Option Explicit On
Option Strict On
Option Compare Binary
'Option Infer Off

Class Q4671082A

Public Shared Function dec(ByVal decNum0 As Integer) As String
Dim dec2bit As String
Dim decNum As Long
Dim ret As Long

If decNum0 >= 0 Then
'正、0はそのままセット
decNum = decNum0
Else
'負のときは、そのビットイメージをセット(例-1なら4294967296)
decNum = decNum0 + 4294967296
End If
dec2bit = ""
'文字列を作成

For i As Integer = 1 To 32
'最上位ビット(最も左側のビット)が1か0か判定
ret = decNum And 2147483648 '2147483648は符号無しの&H80000000に相当
If ret <> 0 Then
dec2bit = dec2bit & "1"
Else
dec2bit = dec2bit & "0"
End If
'左へ1ビットシフトする
'シフト演算子
decNum = decNum << 1
'オーバーフロー防止
If decNum >= 4294967296 Then
decNum = decNum - 4294967296
End If
Next
Return dec2bit
End Function



Shared Sub Main()
Dim fuga As Q4671082A
fuga = New Q4671082A()
System.Console.WriteLine(Q4671082A.dec(Integer.MaxValue))
System.Console.WriteLine(System.Convert.ToString(Integer.MaxValue,2).PadLeft(32,"0"c))

System.Console.WriteLine(Q4671082A.dec(29584))
System.Console.WriteLine(System.Convert.ToString(29584,2).PadLeft(32,"0"c))

System.Console.WriteLine(Q4671082A.dec(-29584))
System.Console.WriteLine(System.Convert.ToString(-29584,2).PadLeft(32,"0"c))

System.Console.WriteLine(Q4671082A.dec(Integer.MinValue))
System.Console.WriteLine(System.Convert.ToString(Integer.MinValue,2).PadLeft(32,"0"c))

'キーボード入力待ち
System.Console.ReadKey(True)

’質問文ではString型のものをLong型に代入しているが,これは避けたい。
'というか、そこだけは、何をやろうとしているのかさっぱり判らん。
End Sub




End Class
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!