我有一个从某个网站复制的示例程序。
int main(void)
{
int answer;
short x = 1;
long y = 2;
float u = 3.0;
double v = 4.4;
long double w = 5.54;
char c = 'p';
typedef enum
{
kAttributeInvalid,
kBooleanAttributeActive,
kBooleanAttributeAlarmSignal,
kBooleanAttributeAlign64,
kBooleanAttributeAutoNegotiationComplete,
}codes_t;
/* __DATE__, __TIME__, __FILE__, __LINE__ are predefined symbols */
#if 0
printf("Date : %s\n", __DATE__);
printf("Time : %s\n", __TIME__);
printf("File : %s\n", __FILE__);
printf("Line : %d\n", __LINE__);
#endif
/* The size of various types */
printf("The size of int %zu\n", sizeof(answer));
printf("The size of short %zu\n", sizeof(x));
printf("The size of long %zu\n", sizeof(y));
printf("The size of float %zu\n", sizeof(u));
printf("The size of double %zu\n", sizeof(v));
printf("The size of long double %zu\n", sizeof(w));
printf("The size of char %zu\n", sizeof(c));
printf("The size of enum %zu\n", sizeof(codes_t));
return 0;
}
我运行了这个程序,得到的输出如下。
The size of int 4
The size of short 2
The size of long 8
The size of float 4
The size of double 8
The size of long double 16
The size of char 1
The size of enum 4
我在运行 64 位 Ubuntu 的 linux PC 上运行它。我的问题是如果我要在 32 位机器上运行相同的程序,我会看到不同的结果。或者换句话说,基本数据的大小类型取决于
最佳答案
由于必须在 32 位变体中安装一些库 [可能只是 glibc],您应该可以使用 gcc -m32 myprog.c
[或 clang -m32 myprog.c
] 自己尝试一下。
但是,如果您使用基于 gcc 的编译器从 64 位 x86 linux 系统移动到 32 位 x86 linux 系统,那么列出的项目中唯一会发生变化的是 long
的大小。请注意 x86、gcc 等的重限定——编译器有很大的自由度。有人可以为 Linux 编写一个编译器,它在 32 位系统上使用 16 位 int
和 64 位 long
,不会有太大的困难。使用该编译器编译 Linux 内核和许多 Linux 工具可能会失败[很可能包括使用该编译器编译 gcc
]。但是你不能真正说“在这个架构上”或“在这个操作系统中”或“使用这个编译器”......而不限定 OTHER 参数是什么。
举个例子:Microsoft C/C++ 编译器有一个 long
,即使在 64 位系统上也是 32 位。为什么,我听到你问?因为当 Windows 是 Intel 286/386 处理器上的 16 位操作系统时,大量 Windows API 函数使用 long
作为 32 位值作为旧值。由于(某些)系统调用在 Windows 中向后兼容很长一段时间,为 16 位系统编写的代码仍然可以在 64 位 Windows 上运行 [除非代码使用了一些非常不寻常的系统调用,当然,STYLE 会显得有点古老]。将 long
更改为 64 位值会破坏某些功能,因此 MS 的编译器人员决定坚持使用 long
= 32 位。如果您想要 64 位整数,则必须使用 long long
或 int64_t
或其他东西,而不是 long
。当然,这打破了一些假设 sizeof(long) == sizeof(void *)
的代码。希望大多数这样的代码已经被修复......
关于c - C 中基本数据类型的大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14821738/