tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルDWORDの変換に関して
記事No12461
投稿日: 2008/06/07(Sat) 20:37
投稿者信長
こんにちは、いつもお世話になっております

ちょっとベタなことが気になってしまい、いろいろ調べたんですが確証がとれなかったんで質問させてください

Declare文で 外部dllやAPIからDWORD(unsigned long)を読み込む場合 いつもLongで読み込んでいたんですが
Longの上限値=2,147,483,647を超えた場合どうなってくるんでしょうか?
ビットで考えると補数に・・・マイナスになるんでしょうか?

具体的にコードにするなら、取得値がマイナスの場合 (単純に考えるなら)2^32加算する必要がありますよね
(その場合 Doubleで受けないといけませんが)

昔のコードを開いていて、盲点でした(機械的にAPIビューアで変換していたので・・)

このような考え方でいいのでしょうか?

[ツリー表示へ]
タイトルRe: DWORDの変換に関して
記事No12462
投稿日: 2008/06/07(Sat) 23:19
投稿者魔界の仮面弁士
> Longの上限値=2,147,483,647を超えた場合どうなってくるんでしょうか?
> ビットで考えると補数に・・・マイナスになるんでしょうか?
その通り、負数になります(16bit整数の場合も同様です)。

&H7FFFFFFE (+2,147,483,646) の次の値は、
&H7FFFFFFF (+2,147,483,647) になり、さらに次は
&H80000000 (-2,147,483,648) になり、さらに次は
&H80000001 (-2,147,483,647) になる…といった感じです。


> 具体的にコードにするなら、取得値がマイナスの場合 (単純に考えるなら)2^32加算する必要がありますよね
負数では都合が悪い物(たとえば、ファイルサイズなど)であれば、unsigned 化の
必要がありますが、値そのものには意味が無い場合(ウィンドウ ハンドルなど)には、
その必要は無い(むしろ加算すべきでは無い)でしょうね。

> (その場合 Doubleで受けないといけませんが)
変数のサイズが異なるので、Declare 側は変更してはいけません。
それを標準モジュール等でカプセル化する際には、別のデータ型で表現すると
良いとは思いますが、それには Double よりも、Currency の方が適しているでしょう。

[ツリー表示へ]
タイトルRe: DWORDの変換に関して
記事No12463
投稿日: 2008/06/07(Sat) 23:24
投稿者GOD
> Declare文で 外部dllやAPIからDWORD(unsigned long)を読み込む場合 いつもLongで
> 読み込んでいたんですが
> Longの上限値=2,147,483,647を超えた場合どうなってくるんでしょうか?
> ビットで考えると補数に・・・マイナスになるんでしょうか?
>
前に自作のDLL作って行った実験だとマイナスになっていました。
_http://hpcgi1.nifty.com/MADIA/VBBBS/wwwlng.cgi?print+200502/05020047.txt
下から2番目の記事。

> 具体的にコードにするなら、取得値がマイナスの場合 (単純に考えるなら)2^32
> 加算する必要がありますよね
> (その場合 Doubleで受けないといけませんが)
>
全てを+値として扱いたいときは、一度Longで受けた後、DecimalかCurrencyあたりに入
れ直す必要があります。(マイナス値の場合は2^32を加算して)
私はDecimalを使ったことはないですが。

Doubleで直接受けることはできないと思います。多分コンパイルエラーになると思う。
仮にコンパイルが通っても予想外の値を取得するはずです。(このあたりは未検証)

[ツリー表示へ]
タイトルRe^2: DWORDの変換に関して
記事No12465
投稿日: 2008/06/08(Sun) 15:11
投稿者信長
魔界の仮面弁士様 GOD様 ご丁寧な回答ありがとうございます
特に、魔界の仮面弁士様からレスいただけるとは・・・
なにせ、4〜5年ぶりのVBだったもので、ここにも久々でした 今、懐かしさであふれています

> (その場合 Doubleで受けないといけませんが)
誤解を招いて済みません、一時変数ローカル変数を使うって意味でした
お二方にあるように通貨型ですか これは盲点でした

なにより、疑問がはれてすっきりしました
心よりお礼申し上げます

[ツリー表示へ]