• 締切済み

10進を2進(32ビット)に変換

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

みんなの回答

回答No.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

関連するQ&A