web-dev-qa-db-ja.com

Cプログラムを作成せずに、システム上のデータ型(int、float、doubleなど)のサイズを調べることは可能ですか?

Cプログラムを書かずに、Linuxシステムのデータ型(int、float、doubleなど)のサイズを調べることはできますか?

Cの結果はC++と同じで、他のプログラミング言語は同じLinuxシステムにありますか?

20
Tim

必要なデータ型の定義がわかっている場合は、getconfを使用して、ほとんどのUnixシステムでこれらの値を見つけることができます。

$ getconf CHAR_BIT
8

変数のリストは、ディスク上にあるだけでなく、man limits.hのマニュアルページとman sysconfで定義されています。あなたはそれを見つけるためにlocate limits.hを使うことができます、それはしばしばここにあります:/usr/include/linux/limits.h

19
slm

やや。

少なくともgccでは、これは機能します。

$ cpp -dD /dev/null | grep __SIZEOF_LONG__

とにかく、それを行うためのCプログラムを作成してみませんか?次のような小さなCプログラムをシェルからコンパイラに送信できます。

binary=$(mktemp)
cat <<\EOF | cc -o $binary -x c -
#include <stdio.h>
int main() {
    printf("int=%lu bytes\n", sizeof(int));
    printf("long=%lu bytes\n", sizeof(long));
}
EOF
$binary
rm $binary

-x cは、コンパイラに言語がCであることを伝え、-は、標準入力から読み取ることを意味します。

私のシステムでは、上記の出力は次のとおりです。

int=4 bytes
long=8 bytes

Gccとclangでテストされています。

11
Mikel

はい。スキャンできます/usr/include/<Arch>/limits.h

たとえば、私のNetBSD AMD64では、/usr/include/AMD64/limits.hは次のように表示されます:

#define CHAR_BIT        8               /* number of bits in a char */

#define SCHAR_MAX       0x7f            /* max value for a signed char */
#define SCHAR_MIN       (-0x7f-1)       /* min value for a signed char */

#define UCHAR_MAX       0xff            /* max value for an unsigned char */
#define CHAR_MAX        0x7f            /* max value for a char */
#define CHAR_MIN        (-0x7f-1)       /* min value for a char */

#define USHRT_MAX       0xffff          /* max value for an unsigned short */
#define SHRT_MAX        0x7fff          /* max value for a short */
#define SHRT_MIN        (-0x7fff-1)     /* min value for a short */

#define UINT_MAX        0xffffffffU     /* max value for an unsigned int */
#define INT_MAX         0x7fffffff      /* max value for an int */
#define INT_MIN         (-0x7fffffff-1) /* min value for an int */

#define ULONG_MAX       0xffffffffffffffffUL    /* max value for an unsigned long */
#define LONG_MAX        0x7fffffffffffffffL     /* max value for a long */
#define LONG_MIN        (-0x7fffffffffffffffL-1)        /* min value for a long */
8
devnull

Perlがインストールされている場合は、Perl -Vから取得できます。

intsize=4, longsize=8, ptrsize=8, doublesize=8, byteorder=12345678
d_longlong=define, longlongsize=8, d_longdbl=define, longdblsize=16
ivtype='long', ivsize=8, nvtype='double', nvsize=8, Off_t='off_t', lseeksize=8
alignbytes=8, prototype=define
8
Mark Wagner

特に... 64ビットアーキテクチャでは、基本型のサイズのさまざまなアイデアでバイナリを実行することができますです。 x86_64上の最近のLinuxカーネルは、ネイティブ32ビットバイナリを実行でき、32ビットタイプの x32 ABI があります。

データ型のサイズは、コンパイラが使用するものの一部です。ただし、(1)マシンが効率的にサポートする型を使用し、(2)低レベルライブラリからユーザーアプリケーションを通じて一貫して型を使用することは、明らかに有利です。いくつかのバリアントを処理する必要があるのは、単なる混乱です。

6
vonbrand

データ型のサイズは、システムではなく、コンパイラ(またはABI)のプロパティです。同じシステム上で、データ型の異なるサイズを使用する複数のコンパイラーを持つことができます。

6
kaalus

これを試して、データ型を参照する文字列を含む行を解析して出力します。

{ shopt -s globstar; for i in /usr/include/**/*.h; do grep -HE '\b(([UL])|(UL)|())LONG|\bFLOAT|\bDOUBLE|\bINT' $i; done; }

これはもちろん/usr/include/limits.hの定義をキャッチするので、場合によっては値でさらにプラスされますが、主にlimits.hで設定されているものを参照しているため、getconf -aで簡単に確認できます。およびulimit -aコマンド。

0
user44370