根据所有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位宽.
像 char 或 sizeof(int) 中的位数之类的事情是否取决于 CPU、操作系统、编译器或上述的某种组合?
依赖于编译器。并且您的编译器本身依赖于 CPU 和操作系统。
这意味着,如果您在 PC 上编译一个具有 4 个字节的程序int,void*并将可执行文件移动到另一台机器上,则不会发生字节数不同的情况。编译器输出特定机器的机器代码。
但是,如果您在不同的编译器上编译相同的源代码,或者在不同的操作系统上编译相同的编译器版本,或者在相同的编译器上但使用不同的设置,那么您可能会遇到更改。
例如,在我的带有 64 位 GCC 的 PC 上,void*需要 8 个字节,但我用-m32它编译将需要 4 个字节。