Cubeの日記: メモ:自分で利用可能なシステムのデータサイズ 2
#include <stdio.h>
#include <stdlib.h>
#define TYPE_COUNT 8
int main( int argc, char *argv[] ) {
char c = 0;
short int s = 0;
int i = 0;
long l= 0l;
long long ll = 0l;
float f = 0.0;
double d = 0.0;
long double ld = 0.0;
unsigned int sz[TYPE_COUNT];
char *typenames[TYPE_COUNT];
typenames[0] = "char";
typenames[1] = "short";
typenames[2] = "int";
typenames[3] = "long";
typenames[4] = "long long";
typenames[5] = "float";
typenames[6] = "double";
typenames[7] = "long double";
sz[0] = sizeof(c);
sz[1] = sizeof(s);
sz[2] = sizeof(i);
sz[3] = sizeof(l);
sz[4] = sizeof(ll);
sz[5] = sizeof(f);
sz[6] = sizeof(d);
sz[7] = sizeof(ld);
for ( s = 0; s < TYPE_COUNT; s++ ) {
printf("%12s: %3d [Byte] ( = %3d [bit])\n",
typenames[s], sz[s], sz[s] * 8 );
}
return 0;
}
上記ソースを異なる環境で,
コンパイルオプションは出力ファイル名だけ,
という条件でコンパイルし,実行した結果
Windows XP (32bit) + VC7
H:\>.\test_size
char: 1 [Byte] ( = 8 [bit])
short: 2 [Byte] ( = 16 [bit])
int: 4 [Byte] ( = 32 [bit])
long: 4 [Byte] ( = 32 [bit])
long long: 8 [Byte] ( = 64 [bit])
float: 4 [Byte] ( = 32 [bit])
double: 8 [Byte] ( = 64 [bit])
long double: 8 [Byte] ( = 64 [bit])
H:\>
FedoraCore4 (i686)
[hoge@pike ~]$ ./test_size
char: 1 [Byte] ( = 8 [bit])
short: 2 [Byte] ( = 16 [bit])
int: 4 [Byte] ( = 32 [bit])
long: 4 [Byte] ( = 32 [bit])
long long: 8 [Byte] ( = 64 [bit])
float: 4 [Byte] ( = 32 [bit])
double: 8 [Byte] ( = 64 [bit])
long double: 12 [Byte] ( = 96 [bit])
[hoge@pike ~]$
Solaris 8(SPARC) + gcc
Sun Microsystems Inc. SunOS 5.8 Generic Patch October 2001
[hoge@hage (SunOS) hoge]$ ./test_size
char: 1 [Byte] ( = 8 [bit])
short: 2 [Byte] ( = 16 [bit])
int: 4 [Byte] ( = 32 [bit])
long: 4 [Byte] ( = 32 [bit])
long long: 8 [Byte] ( = 64 [bit])
float: 4 [Byte] ( = 32 [bit])
double: 8 [Byte] ( = 64 [bit])
long double: 16 [Byte] ( = 128 [bit])
[hoge@hage (SunOS) hoge]$
MacOSX Tiger(G4)
Welcome to Darwin!
hoge@moge / Power Macintosh [ Darwin 8.3.0 ]
(ttyp2 | 15:52:20 ~)$ ./test_size
char: 1 [Byte] ( = 8 [bit])
short: 2 [Byte] ( = 16 [bit])
int: 4 [Byte] ( = 32 [bit])
long: 4 [Byte] ( = 32 [bit])
long long: 8 [Byte] ( = 64 [bit])
float: 4 [Byte] ( = 32 [bit])
double: 8 [Byte] ( = 64 [bit])
long double: 16 [Byte] ( = 128 [bit])
hoge@moge / Power Macintosh [ Darwin 8.3.0 ]
(ttyp2 | 15:52:26 ~)$
Windows + VC7 では long double の変数宣言に
全く意味が無い,ということがわかった,
#[2005/12/12 追記]
Windows XP(32bit) + Cygwin GCC
hoge@boke ~
$ ./test_size.exe
char: 1 [Byte] ( = 8 [bit])
short: 2 [Byte] ( = 16 [bit])
int: 4 [Byte] ( = 32 [bit])
long: 4 [Byte] ( = 32 [bit])
long long: 8 [Byte] ( = 64 [bit])
float: 4 [Byte] ( = 32 [bit])
double: 8 [Byte] ( = 64 [bit])
long double: 12 [Byte] ( = 96 [bit])
hoge@boke ~
$
Cygwin は RedHat系 Linux のクローンだから、FedoraCore4 と同様の結果なのか?
とおもいきや
Windows XP(32bit) + SFU GCC
bash-2.05b$ ./test_size
char: 1 [Byte] ( = 8 [bit])
short: 2 [Byte] ( = 16 [bit])
int: 4 [Byte] ( = 32 [bit])
long: 4 [Byte] ( = 32 [bit])
long long: 8 [Byte] ( = 64 [bit])
float: 4 [Byte] ( = 32 [bit])
double: 8 [Byte] ( = 64 [bit])
long double: 12 [Byte] ( = 96 [bit])
bash-2.05b$
やはり、VC7 だけが "long double" と "double" に違いが無いようで。バグ?
バグじゃないって。 (スコア:1)
九州大学高度プログラミング演習の「平均値, 分散」のページ [kyushu-u.ac.jp]を見ても、
> サイズは,float≦double≦long doubleになります.
と書いてあります。
手元にCの本が無くてうろ覚えなのでID。
Re:バグじゃないって。 (スコア:1)
以上という規格を逆手にとって,
実際にプログラミングをする人間にとっては直感的ではないけれど
MSにとって最も効率の良い実装
をしているわけですね.
Cube