首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C中基本数据类型的大小

C中基本数据类型的大小
EN

Stack Overflow用户
提问于 2013-02-11 22:03:38
回答 5查看 23K关注 0票数 4

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

代码语言:javascript
复制
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;
}

我运行了这个程序,得到的输出如下。

代码语言:javascript
复制
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.My的linux PC上运行这个程序,问题是如果我在32位计算机上运行同一个程序,我会看到不同的results.Or,换句话说,基本数据类型的大小取决于

  1. 处理器
  2. 操作系统
  3. 还要别的吗
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-02-11 22:32:34

如果必须安装一些库,可能只是在它的32位变体中安装glibc,您应该可以使用gcc -m32 myprog.cclang -m32 myprog.c亲自尝试。

然而,如果您使用gcc编译器将64位x86 linux系统转换为32位x86 linux系统,所列出的项目中唯一会发生变化的是long的大小。请注意x86、gcc等人的严格限制--编译器有很大的自由度.有人可以为Linux编写编译器,在32位系统上使用16位int和64位long,没有太大的困难。使用该编译器编译Linux内核和许多Linux工具很可能会失败,包括使用该编译器编译gcc。但是你不能说“在这个架构上”或者“在这个操作系统中”或者“用这个编译器”.而不需要限定其他参数是什么。

例如: Microsoft /C++编译器的long为32位,甚至在64位系统上也是如此。怎么,我听到你问了?因为许多Windows函数使用long作为32位值作为遗留的,当时Windows是英特尔286/386处理器上的16位操作系统。由于(有些)系统调用在Windows中是向后兼容的,为16位系统编写的代码仍然可以在64位Windows上工作,除非代码使用的是一些非常不寻常的系统调用,当然,这种风格看起来有点过时。如果将long更改为64位值,就会破坏其中一些功能,因此MS的编译器人员决定坚持使用long = 32位。如果您想要64位整数,则必须使用long longint64_t或其他什么,而不是long。当然,这会破坏一些假定为sizeof(long) == sizeof(void *)的代码。希望大多数这样的代码已经被修正了..。

票数 4
EN

Stack Overflow用户

发布于 2013-02-11 22:06:21

我的问题是,如果我在32位机器上运行同一个程序,我会看到不同的结果吗?

也许吧。也可能不是。

换句话说,基本数据类型的大小取决于1)处理器2)操作系统3)其他任何东西吗?

  1. 是的,2.是的,3.是的,例如,如果你在64位操作系统上运行32位兼容模式的32位应用程序,那么它很可能会使用32位字大小(当然,它是这样编译的)。哦,是的,它也可能取决于编译器。

“还有你的编译器标志.”(谢谢,凯!)

票数 7
EN

Stack Overflow用户

发布于 2013-02-11 22:09:05

如果您关心变量的确切大小,请使用

代码语言:javascript
复制
#include <stdint.h>

然后使用在其中定义的固定宽度类型:

代码语言:javascript
复制
uint8_t
uint16_t
uint32_t
uint64_t

或者他们的表兄弟姐妹

代码语言:javascript
复制
int8_t
int16_t
int32_t
int64_t

不要依赖C中本机类型的大小。不同的编译器有不同的规则。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14821738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档