我有一个示例程序,我从某个网站复制。
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.My的linux PC上运行这个程序,问题是如果我在32位计算机上运行同一个程序,我会看到不同的results.Or,换句话说,基本数据类型的大小取决于
发布于 2013-02-11 22:32:34
如果必须安装一些库,可能只是在它的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。但是你不能说“在这个架构上”或者“在这个操作系统中”或者“用这个编译器”.而不需要限定其他参数是什么。
例如: Microsoft /C++编译器的long为32位,甚至在64位系统上也是如此。怎么,我听到你问了?因为许多Windows函数使用long作为32位值作为遗留的,当时Windows是英特尔286/386处理器上的16位操作系统。由于(有些)系统调用在Windows中是向后兼容的,为16位系统编写的代码仍然可以在64位Windows上工作,除非代码使用的是一些非常不寻常的系统调用,当然,这种风格看起来有点过时。如果将long更改为64位值,就会破坏其中一些功能,因此MS的编译器人员决定坚持使用long = 32位。如果您想要64位整数,则必须使用long long或int64_t或其他什么,而不是long。当然,这会破坏一些假定为sizeof(long) == sizeof(void *)的代码。希望大多数这样的代码已经被修正了..。
发布于 2013-02-11 22:06:21
我的问题是,如果我在32位机器上运行同一个程序,我会看到不同的结果吗?
也许吧。也可能不是。
换句话说,基本数据类型的大小取决于1)处理器2)操作系统3)其他任何东西吗?
“还有你的编译器标志.”(谢谢,凯!)
发布于 2013-02-11 22:09:05
如果您关心变量的确切大小,请使用
#include <stdint.h>然后使用在其中定义的固定宽度类型:
uint8_t
uint16_t
uint32_t
uint64_t或者他们的表兄弟姐妹
int8_t
int16_t
int32_t
int64_t不要依赖C中本机类型的大小。不同的编译器有不同的规则。
https://stackoverflow.com/questions/14821738
复制相似问题