c/c ++中类型的大小

Bar*_*uch 6 c c++ sizeof

我最近在这里问了一个关于尺寸的问题char.看着我的问题,它给我带来了另一个问题:
有些事情就像位数的charsizeof(int)依赖CPU,OS依赖,依赖于编译器,或上述的某种组合?谁决定sizeof(int)我的编译器是4?

编辑:让我解释一下:例如,我在64位系统上的编译器使用32位int.编译器或操作系统是否将此设置为此(精确)OS /平台组合上所有编译器的标准int?如何char= 8位?OS可以决定使用16位字符吗?可以编译吗?

orl*_*rlp 6

根据所有ISO C标准,所有尺寸都以a的尺寸的倍数来测量char.根据定义,这意味着sizeof(char) == 1.的大小char在比特由宏定义CHAR_BIT<limits.h>(或<climits>).a的最小大小char是8位.

其他类型限制是:

sizeof(char) <= sizeof(short int) <= sizeof(int) <= sizeof(long int)
Run Code Online (Sandbox Code Playgroud)

int 必须能够表示-32767到+32767 - 例如它必须至少为16位宽.

C99补充说long long int,谁的大小大于或等于long int.

其余的是依赖于实现的.这意味着有问题的C编译器可以选择确切数字的大小.


C编译器如何选择这些尺寸?

大多数编译器遵循一些常见的约定.long通常选择与机器字一样大.在64位机器上CHAR_BIT == 8(这几乎总是如此,所以我假设对于这个答案的其余部分)这意味着sizeof(long) == 8.在32位机器上这意味着sizeof(long) == 4.

int 几乎总是32位宽.

long long int 通常是64位宽.


Kos*_*Kos 3

像 char 或 sizeof(int) 中的位数之类的事情是否取决于 CPU、操作系统、编译器或上述的某种组合?

依赖于编译器。并且您的编译器本身依赖于 CPU 和操作系统。

这意味着,如果您在 PC 上编译一个具有 4 个字节的程序intvoid*并将可执行文件移动到另一台机器上,则不会发生字节数不同的情况。编译器输出特定机器的机器代码。

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

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