我有一个从某个网站复制的示例程序。

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 longint64_t 或其他东西,而不是 long 。当然,这打破了一些假设 sizeof(long) == sizeof(void *) 的代码。希望大多数这样的代码已经被修复......

    关于c - C 中基本数据类型的大小,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14821738/

    10-17 01:35