ちなみに私のマシンは
メモリ 192MB
Windows2000
ですが
200MBのエリアを試しに確保しましたが、数分かかりました。
この間、ハードディスクのアクセスランプがつきっぱなしでした。
もう二度とこんなことはしないぞ。
追伸
先ほどのテスト後、マシンのレスポンスが遅くなりました。
このため、再立ち上げを行いました。
よい子のみんなはマネしないように。
> アプリは画像・音声一杯あります。
当面必要なものだけメモリ上に置いておいて、
残りはファイルなどに置いておくといった工夫をするのが普通だと思いますが。
勉強不足ですみません。
>この値は、mallocには5GBではなく1GBとして渡されます。
>5GBを0xffffffffでANDしてみると解ります
>
>5GBは0x140000000ですがこれに0xffffffffをANDすると
>0x040000000(1GB)となります。
なんでUNSIGNED INTの時は
0xffffffffでANDしないと
いけないのでしょうか?
>この値は、0xf000000000(960GB)ですがこれに0xffffffffをANDすると
>0x0000000000(0バイト)となります。
>このため、こちらは正常応答となっています。
正常応答と言っても、
エリアとしては確保できていないのですね。
ここでは
> なんでUNSIGNED INTの時は
> 0xffffffffでANDしないと
> いけないのでしょうか?
うんにゃ。単純にオーバーフローしているだけの話。
変数に格納されるのは,オーバーフローして0xFFFFFFFFとの論理積になるということを,
アイススケーターさんは言いたいのだと思います。
次のプログラムを実行してみてください。
#include <stdio.h>
int main (void)
{
size_t size = 100 * 256 * 256 * 200 * sizeof(int);
printf(%x\n, size);
return 0;
}
Tjさんが予期しているはずの138800000ではなく,38800000が表示されるはずです。
YuOさん代弁ありがとうございました。
データの範囲はWindowsの場合は
char - 0x80 ~ 0x7f
BYTE 0 ~ 0xff
short - 0x8000 ~ 0x7fff
WORD 0 ~ 0xffff
int(long) -0x8000000 ~ 0x7fffffff
unsigned int 0 ~ 0xffffffff
※int は別システムではshortと同じ範囲となる場合もある。
です。
計算値がオーバーフローすると計算結果でオーバーフローした上位分を切り捨てます。
↓YuOさんが書いてくださった分
>#include <stdio.h>
>int main (void)
>{
> size_t size = 100 * 256 * 256 * 200 * sizeof(int);
> printf(%x\n, size);
> return 0;
>}
>Tjさんが予期しているはずの138800000ではなく,38800000が表示されるはずです。
100 * 256 * 256 * 200 * sizeof(int) -> 0x138800000
~--------
↑の~部分がオーバーフローした上位分です。
C言語は、オーバーフローした分をエラーとして返さないためプログラマはこれを意識
してプログラムする必要があります。
アセンブラならオーバーフローしたときにフラグが立つのですが、ここでは関係ないので
あまり触れないようにします。
ここまで書いて、解らない場合は、もうめんどうみきれません。
さようなら
なるほど。
よくわかりました。
変数がふくらんだので、今後は
かなりの分、
ファイルをFOPENしてFPUTしていこうと思います。
解決です。