- ベストアンサー
メタ関数の定義によってpower<10L,10L>の結果はなぜintになるのか
- gcc4.1.2で定義されているメタ関数を使用してpower<10L,10L>を計算すると、longではなくintになります。
- powerメタ関数の実装では、再帰的な定義を使っているため、計算結果がintの範囲に収まってしまう可能性があります。
- 具体的には、powerメタ関数の再帰的な計算でオーバーフローが発生し、値がintの最大値を超えると、結果がintにクランプされます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
基本的なことはすでに回答されているとおりです。 GCCはたくさんのプラットフォームに対応していますので、ターゲットが何であるかを明確にしなければ、また、コンパイルオプションを明確にしなければ、正確なことは何も言えなくなるのです。 たとえば、64ビット版のWindows 7でコンパイルした場合でも、ターゲットがH8/300Hであれば、long型は32ビットになります。GCCのバージョンが3.3.xあたりまでは、long long型であっても32ビットしかありません。double型も32ビットでfloat型と同じ精度になります。 このように、重要なのは実行ターゲットのほうであって、コンパイルするホストではありません。
その他の回答 (4)
- tatsu99
- ベストアンサー率52% (391/751)
GCCでコンパイルした場合、long型は、32ビットモードのコンパイルの場合は4バイト整数です。つまりint型と同じサイズです。64ビットモードでコンパイルすれば8バイト整数になります。たぶんあなたは、こちらのほうを期待されているのかと思いますので、64ビットモードでコンパイルをすれば、期待した結果になると思います。 但し、64ビットモードで動作させるには、OS自体が64ビット版である必要があります。OSが提示されていないのでわかりませんが、もし、32ビット版のOSで8バイト整数を使用したいなら、long long int型を使用してください。この型はOSが32ビット版でも64ビット版でも、常に8バイト整数になります。
- kmee
- ベストアンサー率55% (1857/3366)
#include <cstdio> int main(int argc,char **argv){ printf( "int %d, long %d\n", sizeof(int),sizeof(long) ) ; return 0 ; } この結果、どうなりますか? 規格では short≦int≦long となっているので、longがintより大きいとは限りません。
お礼
どうもありがとうございました. 私の勘違いだったようです. ご迷惑をおかけしましたが今後もなにとぞ 宜しくお願いします.
- Tacosan
- ベストアンサー率23% (3656/15482)
「それが実は long で計算したときの『正しい』値である」という可能性は考えませんでしたか? つまり, (メタじゃない) 普通の関数で long power(long base, long exp) { long result = 1; while (--exp) { result *= base; } return result; } としたときと同じ結果になるなら「long として正しい値」ですよね. 余談だけど, この場合の「指数」を index とするのは違和感がある.
お礼
どうもありがとうございました. 私の勘違いだったようです. ご迷惑をおかけしましたが今後もなにとぞ 宜しくお願いします.
補足
10の10乗なので計算しなくとも(longを使えばオーバーフローしないとすると) 答えは10000000000になるはずですが実際には1410065408となります. 負の数にならないのはおかしい気がするけどたぶんどこかで正の数にしてしまったのだと 思いました
- Tacosan
- ベストアンサー率23% (3656/15482)
コンパイラだけ言われてもあんまり意味はないような気がする. 「long で計算された値」と「int で計算された値」とで, 何がどう違うんでしょうか?
お礼
どうもありがとうございました. 私の勘違いだったようです. ご迷惑をおかけしましたが今後もなにとぞ 宜しくお願いします.
補足
ご回答どうもありがとうございます 10の9乗までは正しく計算できますが,10の10乗は正しく計算できません. longのところをintに変えたところ計算値はlongの場合と同じでした. これらのことより恐らく2の32乗を超えたときに計算結果がただしく 計算されていないように思いました. (正確な値による検証はしていないですけど,それはそうとコンパイル時 の途中結果のデバッグってどうやればよいのかな?)
お礼
どうもありがとうございます. わたくしのくだらない勘違いにお付き合い させたようでもうしわけありません. 私はこのようなおかしな間違いをよくするので 今後もよろしくお願いします.
補足
なるほど,やっと皆さんのおっしゃっていることがわかりました. 確かにlongは32ビットでintと同じでした. てっきり64ビットと思い込んでいました. みなさんどうもありがとうございました.