6

我最近在这里问了一个关于char. 看着我的问题,它给我带来了另一个问题:是依赖于 CPU或CPU
中的位数,依赖于操作系统,依赖于编译器,还是上述的某种组合?谁决定我的编译器中的 4?charsizeof(int)sizeof(int)

编辑:让我解释一下:例如,我在 64 位系统上的编译器使用 32bit int。这是由编译器还是由操作系统设置为这个(确切的)操作系统/平台组合上所有编译器的标准 int ?char= 8位怎么样?操作系统可以决定使用 16 位字符吗?编译器可以吗?

4

3 回答 3

6

According to all ISO C standards, all sizes are measured in multiples of the size of a char. This means, by definition sizeof(char) == 1. The size of a char in bits is defined by the macro CHAR_BIT in <limits.h> (or <climits>). The minimum size of a char is 8 bits.

Additional type restrictions are:

sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)

int must be able to represent -32767 to +32767 - e.g. it must be at least 16 bits wide.

C99 added long long int, who's size is larger or equal to long int.

The rest is implementation-dependant. This means that the C compiler in question gets to choose how large exactly the numbers are.


How do the C compilers choose these sizes?

There are some common conventions most compilers follow. long is often chosen to be as large as a machine word. On 64bits machines where CHAR_BIT == 8 (this is nearly always the case, so I'll assume that for the rest of this answer) this means sizeof(long) == 8. On 32 bit machines this means sizeof(long) == 4.

int is almost always 32 bits wide.

long long int is often 64 bits wide.

于 2012-07-22T13:32:46.967 回答
3

诸如 char 或 sizeof(int) CPU 中的位数之类的东西是依赖于 CPU、依赖于操作系统、依赖于编译器还是上述的某种组合?

编译器相关。而且您的编译器本身是依赖于 CPU 和操作系统的。

这意味着如果你在你的 PC 上编译一个intvoid*4 个字节的程序,并将可执行文件移动到另一台机器上,那么它不可能有不同的字节数。编译器输出特定机器的机器代码。

但是,如果你在不同的编译器上编译相同的源代码,或者在不同的操作系统上编译相同的编译器版本,或者在相同的编译器上使用不同的设置,那么你可能会遇到变化。

例如,在我的带有 64 位 GCC 的 PC 上,void*需要 8 个字节,但我用-m32它编译需要 4 个字节。

于 2012-07-22T13:19:59.120 回答
2

好吧,是编译器设置了这些信息。他根据软件/硬件详细信息(例如您所说的CPU或操作系统)执行此操作。

于 2012-07-22T13:21:34.367 回答