パスワードを忘れた? アカウント作成
547473 journal

Cubeの日記: メモ:自分で利用可能なシステムのデータサイズ 2

日記 by Cube

#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" に違いが無いようで。バグ?

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

皆さんもソースを読むときに、行と行の間を読むような気持ちで見てほしい -- あるハッカー

読み込み中...