char,int,short,long,long long,float,double,long double,size_tの各サイズをx86_32とx86_64それぞれで調べる

Last modified: 2021-09-16

概要

sizeof演算子を用いて

  • char
  • int
  • short
  • long
  • long long
  • float
  • double
  • long double
  • size_t

のそれぞれの型の大きさを得るためのプログラムをx86_64版のGNU/Linux上で作成してx86_32版とx86_64版をそれぞれコンパイルし、結果を比較してみることにする。

ここでは更にその後x86_64に導入されたx32 ABIとも比較してみる。

コード

[任意]ファイル名:sizeoftest.c ライセンス:CC0
#include <stdlib.h>
#include <stdio.h>

/*
 * Print sizes of types (char, int, short,
 * long, long long, float, double, long double, and size_t)
 *
 * (x86_32 = x86)
 * gcc -m32 -Wall -Wextra sizeoftest.c -o sizeoftest32
 *
 * (x86_64 = x64)
 * gcc -m64 -Wall -Wextra sizeoftest.c -o sizeoftest64
 *
 * (x32)
 * gcc -mx32 -Wall -Wextra sizeoftest.c -o sizeoftestx32
 *
 * +-------------+-----+-----+-----+
 * |    type     | x86 | x64 | x32 |
 * +-------------+-----+-----+-----+
 * | char        |   1 |   1 |   1 |
 * | int         |   4 |   4 |   4 |
 * | short       |   2 |   2 |   2 |
 * | long        |   4 |   8 |   4 | <- x86 = x32 != x64
 * | long long   |   8 |   8 |   8 |
 * | float       |   4 |   4 |   4 |
 * | double      |   8 |   8 |   8 |
 * | long double |  12 |  16 |  16 | <- x64 = x32 != x86
 * | size_t      |   4 |   8 |   4 | <- x86 = x32 != x64
 * | void *      |   4 |   8 |   4 | <- x86 = x32 != x64
 * +-------------+-----+-----+-----+
 */

int
main ()
{
    printf ("\
char        : %2zu\n\
int         : %2zu\n\
short       : %2zu\n\
long        : %2zu\n\
long long   : %2zu\n\
float       : %2zu\n\
double      : %2zu\n\
long double : %2zu\n\
size_t      : %2zu\n\
void *      : %2zu\n",
            sizeof (char),
            sizeof (int),
            sizeof (short),
            sizeof (long),
            sizeof (long long),
            sizeof (float),
            sizeof (double),
            sizeof (long double),
            sizeof (size_t),
            sizeof (void *));

    return EXIT_SUCCESS;
}

実行結果

(x86_32版を実行)
$ /path/to/sizeoftest32
char        :  1
int         :  4
short       :  2
long        :  4
long long   :  8
float       :  4
double      :  8
long double : 12
size_t      :  4
void *      :  4

(x86_64版を実行)
$ /path/to/sizeoftest64
char        :  1
int         :  4
short       :  2
long        :  8
long long   :  8
float       :  4
double      :  8
long double : 16
size_t      :  8
void *      :  8

(x32版を実行)
$ /path/to/sizeoftestx32
char        :  1
int         :  4
short       :  2
long        :  4
long long   :  8
float       :  4
double      :  8
long double : 16
size_t      :  4
void *      :  4

サイズの異なる部分があるのは以下の4つの型であることが確認できた。

x86_32 x86_64 x32
long 4 8 4
long double 12 16 16
size_t 4 8 4
void * 4 8 4
  • 使用したバージョン
    • Linux 3.0.13, 5.11.0
    • EGLIBC 2.13
    • glibc 2.33
    • GCC 4.6.1, 10.3.0