- ベストアンサー
16進数の乗算方法と10進数への変換について
- Excel2003で16進数どうしの乗算を行いたいですが、データが64bitであるため計算ができません。VBAを使用してコードを書いて計算しましたが、結果は10進数になってしまいました。Windowsの電卓のように切り捨て処理を行いたいので、64bitに結果を揃えたいです。しかし、Excel上では10進数になってしまう理由がわかりません。
- この質問では、Excel2003で16進数どうしの乗算を行いたいという要望がありますが、データが64bitであるため計算ができません。VBAを使用して計算しましたが、結果は10進数になってしまいました。切り捨て処理を行いたいため、結果を64bitに揃えたいのですが、Excel上ではなぜか10進数になってしまいます。
- Excel2003で16進数の乗算を行いたいのですが、データが64bitであるため計算ができません。VBAを使用して計算しましたが、結果は10進数になってしまいました。64bitにするための切り捨て処理を行いたいのですが、Excel上ではどうしても10進数になってしまいます。なぜなのでしょうか。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
cyo_k08さん はじめまして。 > でも私はその結果を64bitにしたいので… > 私の書いたコードでは10進数になってしまい… 正直、何をしたいのかが分からないですが、勝手に回答させていただきます。 64ビットでも、浮動小数点、固定小数点、整数もあり、また整数でもサインあり、 サインなしがあります。 多分、整数で64ビットの計算をしたいとのことだと思いますがEXCEL(VBA)での問題点や 可能性を整理する必要があります。 【64ビットの整数の範囲】 サイン(+-)あり -9223372036854775808~+9223372036854775807 サイン(+-)なし 0 ~ 18446744073709551615 【数値で計算できるデータ型の選択】 整数型 (Integer) 2 バイト 長整数型 (Long) 4 バイト 単精度浮動小数点数型 (Single) 4 バイト 倍精度浮動小数点数型 (Double) 8 バイト 通貨型 (Currency) 8 バイト 10 進型 (Decimal) 14 バイト ※64ビット=8バイトなので、8バイト以上が必要です、浮動小数点、固定小数点(通貨型) ではだめなので、結果【10 進型】が64ビット計算に使えると思われます。 ※Decimalのデータ型を宣言できませんのでVariant型にし、計算する時Decimalの型変換する 必要があります。 【16進数の表現】 VBAには16進数数値を記述することは可能です。 &HFFFFFFFF 問題は長整数(Longの32ビット)しか指定できないので64ビットなら自分で16進数変換が必要になります。 以上を踏まえて下記の通りプログラムを作成しました。 Sub テストメイン() Debug.Print HEXtoDEC("7FFFFFFFFFFFFFFF") Debug.Print HEXtoDEC("8000000000000000") Debug.Print HEXtoDEC("FFFFFFFFFFFFFFFF") Debug.Print DECtoHEX(CDec("-1") * CDec(164)) Debug.Print DECtoHEX(HEXtoDEC("FFFFFFFFFFFFFFFF") * HEXtoDEC("A4")) End Sub Function HEXtoDEC(HEX As String) As Variant Dim I As Long Dim DEC As Variant If Len(HEX) < 16 Or Val("&H" & Left(HEX, 1)) < 8 Then For I = 1 To Len(HEX) DEC = DEC * CDec(16) + CDec(Val("&H" & Mid(HEX, I, 1))) Next I HEXtoDEC = DEC Else For I = 1 To Len(HEX) DEC = DEC * CDec(16) + (CDec(15) - CDec(Val("&H" & Mid(HEX, I, 1)))) Next I HEXtoDEC = -DEC - 1 End If End Function Function DECtoHEX(ByVal DEC As Variant) As String Dim I As Long Dim sHEX As String If DEC >= 0 Then For I = 1 To 16 sHEX = HEX$(DEC - Int(DEC / CDec(16)) * CDec(16)) & sHEX DEC = Int(DEC / CDec(16)) If DEC = 0 Then Exit For Next I DECtoHEX = sHEX Else DEC = Abs(DEC + CDec(1)) For I = 1 To 16 sHEX = HEX$(CDec(15) - (DEC - Int(DEC / CDec(16)) * CDec(16))) & sHEX DEC = Int(DEC / CDec(16)) Next I DECtoHEX = sHEX End If End Function お試しください。
その他の回答 (1)
- nag0720
- ベストアンサー率58% (1093/1860)
どういう意味で64bitという言葉を使っているんでしょうか? 符号なしの2進数なら64bit=64桁ですが、16進数なら64bit=16桁になります。 16桁の16進数にしたいということなんでしょうか? >64bitにするというのは、Windowsについている電卓のように切り捨て処理をしたいからです。 これはどいう意味? 切り捨て処理とは小数点以下切り捨てのこと? それなら16進とか64bitとかは関係ないと思うんですが。 10進数を16進数にするにはHex関数を使えばできます。 それを16桁にしたいなら、頭に必要な分だけ0を付ければいいでしょう。 ただし、A~Fが入っていない16進数をExcelのセルに表示すると10進数とみなされるので、 セルの表示形式を文字列にするか、先頭に引用符(')を付ける必要があります。
お礼
(補足は余り意味が無いみたいで、無駄な事をしてしまいました。(回答の編集機能は無いのですね)) ありがとうございました。
補足
済みません。かなり説明が欠けていました。calc.exeは、16進モードだと16桁まで表示されます。 例えば0xFFFF FFFF FFFF FFFFと入力して、1以上の数を加算すると17桁目以降を切り捨てて(小数点の意ではありません)16桁まで表示します。それの処理をしたいと思っています。(0xFFFFFFFFFFFFFFFF+1=10000000000000000で、表示できない桁を取って0になります) ちなみに乗算で小数は絶対に出ることが無いです。(2つの数がどちらも非負整数) 説明不足本当に済みませんでした。
お礼
イミディエイトで確認した所、17桁以降が切り捨てられ16桁になっていました。電卓の結果と一致です。本当にありがとうございました。 10進数を16進数に変換するのをどうしたら良いかよく解らなかったのですが(どのように実装するか、です。変換方法自体は知っていました。)、このコードから学ぶ事が出来ます。