VBAを使って4バイトを10進数に変換する方法に関してですが
Dim aaa(3) As Byte
Dim bbb As Long
aaa(0) = 7
aaa(1) = 15
aaa(2) = 15
aaa(3) = 15
bbb = aaa(0) * 4096 + aaa(1) * 256 + aaa(2) * 16 + aaa(3)
bbb = (CInt(aaa(3))) Or (CInt(aaa(2)) * &H10&) Or (CInt(aaa(1)) * &H100) Or (CInt(aaa(0)) * &H1000)
上記の二つの方法が上げられます。
速度を比較したところ、
一つ目の方法の方が30%程度高速であることが分かりました。
それで一つ目の方法を使いたいのですが、
aaa(0)が7以下(bbbが32767以下)なら問題ないのですが
aaa(0)が8以上(bbbが32768以上)になるとなぜかオーバーフローしてしまいます。
32767上限というとintegerの上限のはずですが、
aaa(0)をintegerで定義しても同じところでオーバーフローしてしまいます。
aaa(0)をlongで定義するとオーバーフローしなくなります。
掛け算するときに、入力変数の上限が出力結果に影響を及ぼすのはなぜなのでしょうか?
一度、aaa(0) * 4096の結果が、aaa(0)に代入されてから
bbbに代入されているのでしょうか?
もしそうだとしてもbyteでの上限が255にならず
32767になるのはなぜなのでしょうか?
No.5ベストアンサー
- 回答日時:
> bbb= (aaa(3)) Or (aaa(2) * &H100&) Or (CDbl(aaa(1)) * &H10000) Or (CDbl(aaa(0)) * &H1000000)
> これがオーバーフローするのはなぜでしょうか?
私の環境では、以下の様になりました。
2147483647 Or 1 → 2147483647
2147483648 Or 1 → オーバーフロー
ビット演算を行う場合は両側の数値をInteger型に変換して演算を行う様です。
従ってInteger型の表現できる範囲を超えた数値はオーバーフローします。
※これまでの流れでOr演算子が登場する意図がわかりません。
行いたい目的を記載されたほうが、より適切な回答が付くのではないでしょうか?
No.4
- 回答日時:
URURURUU様
VBは計算する時、右辺のそれぞれの数値の型をみて最大の値が入る型を決定します。
下記を見ますと、右辺は Byte型と整数定数なので【整数型】と判断しています。
よってどれか一つでも大きな数値型を使用すれば良いです。
※例は4096を長整数型(Long)にしています。
bbb = aaa(0) * 4096& + aaa(1) * 256 + aaa(2) * 16 + aaa(3)
お試し下さい。
No.3
- 回答日時:
bbbは代入先としてLong型であると定義しているだけであって、
計算式じたいがLongとは一言もいっていません。
aaa(0) * 4096
という数式を見た場合、Byte型とInteger型です。
この式を処理した時、より表現力の高いInteger型として処理されます。
にも関わらず、Integer型より大きい数値が求められてしまったがためのエラーでしょう。
つまり、解消するには、
bbb = CLng(aaa(0)) * 4096 + CLng(aaa(1)) * 256 + CLng(aaa(2)) * 16 + CLng(aaa(3))
もしくは
bbb = aaa(0) * CLng(4096) + aaa(1) * CLng(256) + aaa(2) * CLng(16) + aaa(3)
とする必要があります。
No.1
- 回答日時:
VBA の変換規則は知らんが, どうせ
・結果の型はオペランドの型で決まる
・2つのオペランドの型が違っている場合には「大きい」方の型にそろえられる
くらいじゃないかねぇ.
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- Excel(エクセル) Excel VBA 3 2023/04/22 10:46
- JavaScript jsonテキストデータの並び替えができるサービスを教えてください 2 2022/08/05 20:16
- SQL Server ACCESSで3ファイルを結合して、表を作成するやり方を教えて下さい。 17 2022/08/15 20:34
- JavaScript 指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードを教えてください 2 2023/04/27 17:58
- Excel(エクセル) Powershell エクセル検索 完全一致の方法 1 2022/06/05 20:19
- その他(データベース) カラム上の重複を削除するクエリを教えてください 3 2022/04/12 14:11
- SQL Server ACCESSで複数テーブルを結合して、リストを作る方法を教えてください。 2 2022/08/12 19:32
- Visual Basic(VBA) VBA。複数のChangeイベントをまとめる方法 2 2022/03/31 12:03
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
4バイトを10進数に変換する方法
-
concat関数内でのシングルクォ...
-
動的な構造体配列の初期化
-
CPUの考え方を教えてください ...
-
UTF-8でエンコーディングとはど...
-
東芝のDynabookなのですがアン...
-
Access VBAでXMLが読み込めない
-
SNMP リンクダウンとノードダ...
-
メモリのセクションに関して
-
xmlファイルが上手にHTMLに変換...
-
このエラー、何とかなりません...
-
replaceChildメソッドについて
-
特殊記号が勝手にエスケープさ...
-
VBSでxmlの値を書き換えたい
-
XSLT
-
XSLTで直下のテキストのみ取得...
-
文字列や画像のurlをhtmlに代入...
-
昔Winnyってありましたけど、あ...
-
XMLファイル内のデータ(値)を変...
-
XSLTがブラウザで表示されません。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
4バイトを10進数に変換する方法
-
VB.NETで最後フォのフォ...
-
concat関数内でのシングルクォ...
-
MSXMLを使ってノードを削除した...
-
掲示板を作成する際、半角英数...
-
Math.sqrt(Math.pow(canvas.wid...
-
XMLのエラーコードの意味が理解...
-
動的な構造体配列の初期化
-
CPUの考え方を教えてください ...
-
東芝のDynabookなのですがアン...
-
XMLで要素が記述された順番に意...
-
昔Winnyってありましたけど、あ...
-
UTF-8でエンコーディングとはど...
-
バッチファイルでテキストファ...
-
ルート要素ノードが2個ある場合?
-
Excel-VBAでXMLの複数ノードの...
-
XML、XSLTの適応エラー(IEから...
-
SNMP リンクダウンとノードダ...
-
同じタグ名の項目取得
-
コンテキストメニュークリック...
おすすめ情報
ありがとうございます。
あと、
dim bbb as double
aaa(0) = 255
aaa(1) = 85
aaa(2) = 85
aaa(3) = 85
bbb = CDbl(aaa(0)) * 16777216 + (aaa(1)) * 65536 + (aaa(2)) * 256 + aaa(3)
これはオーバーフローしなかったのですが
bbb= (aaa(3)) Or (aaa(2) * &H100&) Or (CDbl(aaa(1)) * &H10000) Or (CDbl(aaa(0)) * &H1000000)
これがオーバーフローするのはなぜでしょうか?
たびたび、すいません、
ご回答ありがとうございました。