トップ回答者
お願い教えて!DWORD64の型について

質問
-
DWORD64の型の変数に、格納できる範囲はどこまでなんでしょうか?
64とあるので、64bit変数だと思っていました。どころが、
DOWRD64_1 = int_1 * int_2 * (int_3 + int_4 * int_5)
のような計算式で算出した結果がDOWRD64に格納できませんでした。
32bitを超える数になると、突然ありえない値になってしまいます。
どころが、
DWORD64_2 = int_3 + int_4 * int_5
DWORD64_1 = int_1 * int_2 * DWORD64_2
とすると、正しく値が格納されます。これは、いったいどうなっているのか、誰か教えてください。
よろしくお願いします。
動作環境:Windows7・Vista
開発言語:Visual Studio2005・2010 C++
回答
-
>int_3 + int_4 * int_5
これは32bitで計算され、32bit以内で収まっている>int_1 * int_2 * DWORD64_2
int_1 * int_2は32bitで計算され、32bit以内で収まっている。
* DWORD64_2はDWORD64_2があるので、64bitで計算されている。ということでしょう。
[Standard Conversions]
http://msdn.microsoft.com/en-us/library/aetzh118.aspx>たまたまということなんでしょうか?
int_X変数がとりうる値の範囲が分かりませんが、intの最小値から最大値までとりうるのなら、
”たまたま”ということになります。- 回答としてマーク SHO_Programer 2011年4月6日 1:20
すべての返信
-
>DWORD64の型の変数に、格納できる範囲はどこまでなんでしょうか?
>64とあるので、64bit変数だと思っていました
64bitです。typedef unsigned __int64 DWORD64;
#define INT64_MIN (-9223372036854775807i64 - 1)
#define INT64_MAX 9223372036854775807i64>32bitを超える数になると、突然ありえない値になってしまいます。
int_X変数は32bitですか?計算途中でOverflowしているのでしょう。
DWORD64でcastするか、DWORD64の変数に値を入れてから計算してみてください。 -
>int_3 + int_4 * int_5
これは32bitで計算され、32bit以内で収まっている>int_1 * int_2 * DWORD64_2
int_1 * int_2は32bitで計算され、32bit以内で収まっている。
* DWORD64_2はDWORD64_2があるので、64bitで計算されている。ということでしょう。
[Standard Conversions]
http://msdn.microsoft.com/en-us/library/aetzh118.aspx>たまたまということなんでしょうか?
int_X変数がとりうる値の範囲が分かりませんが、intの最小値から最大値までとりうるのなら、
”たまたま”ということになります。- 回答としてマーク SHO_Programer 2011年4月6日 1:20
-
-
ざっぱに言うと
DOWRD64_1 = int_1 * int_2 * (int_3 + int_4 * int_5) は、
1.1 int_1 * int_2が評価されintに格納(intA)
1.2 int_4 * int_5が評価されintに格納(intB)
1.3 int_3 + intBが評価されintに格納(intC)
1.4 intA * intCが評価されintに格納(intD)
1.5 DWORD64_1 = intDが評価されDWORD64に変換DWORD64_2 = int_3 + int_4 * int_5 は
2.1 int_4 * int_5が評価されintに格納(intA)
2.2 int_3 + intAが評価されintに格納(intB)
2.3 DWORD64_2 = intBが評価されDWORD64に変換DWORD64_1 = int_1 * int_2 * DWORD64_2 は
2.4 int_1 * int_2が評価されintに格納(intC)
2.5 intC * DWORD64_2が評価されDWORD64に格納( DWORD64_X)
2.6 DWORD64_1 = DWORD64_Xが評価される1.xと2.xの違いは、1.4と、2.5の処理の違い、および、
1.5と2.6の処理の違いによるものではないでしょうか。
最初の式も、中間でオーバーフローしないように適当な位置でDWORD64にキャストすれば
正常に計算されるはずですね。