• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:16進数どうしの乗算)

16進数の乗算方法と10進数への変換について

このQ&Aのポイント
  • 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進数になってしまいます。なぜなのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • jcctaira
  • ベストアンサー率58% (119/204)
回答No.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 お試しください。

cyo_k08
質問者

お礼

イミディエイトで確認した所、17桁以降が切り捨てられ16桁になっていました。電卓の結果と一致です。本当にありがとうございました。 10進数を16進数に変換するのをどうしたら良いかよく解らなかったのですが(どのように実装するか、です。変換方法自体は知っていました。)、このコードから学ぶ事が出来ます。

その他の回答 (1)

  • nag0720
  • ベストアンサー率58% (1093/1860)
回答No.1

どういう意味で64bitという言葉を使っているんでしょうか? 符号なしの2進数なら64bit=64桁ですが、16進数なら64bit=16桁になります。 16桁の16進数にしたいということなんでしょうか? >64bitにするというのは、Windowsについている電卓のように切り捨て処理をしたいからです。 これはどいう意味? 切り捨て処理とは小数点以下切り捨てのこと? それなら16進とか64bitとかは関係ないと思うんですが。 10進数を16進数にするにはHex関数を使えばできます。 それを16桁にしたいなら、頭に必要な分だけ0を付ければいいでしょう。 ただし、A~Fが入っていない16進数をExcelのセルに表示すると10進数とみなされるので、 セルの表示形式を文字列にするか、先頭に引用符(')を付ける必要があります。

cyo_k08
質問者

お礼

(補足は余り意味が無いみたいで、無駄な事をしてしまいました。(回答の編集機能は無いのですね)) ありがとうございました。

cyo_k08
質問者

補足

済みません。かなり説明が欠けていました。calc.exeは、16進モードだと16桁まで表示されます。 例えば0xFFFF FFFF FFFF FFFFと入力して、1以上の数を加算すると17桁目以降を切り捨てて(小数点の意ではありません)16桁まで表示します。それの処理をしたいと思っています。(0xFFFFFFFFFFFFFFFF+1=10000000000000000で、表示できない桁を取って0になります) ちなみに乗算で小数は絶対に出ることが無いです。(2つの数がどちらも非負整数) 説明不足本当に済みませんでした。

関連するQ&A