64位计算机上int和sizeof int指针的大小

时间:2013-12-21 16:53:08

标签: c++ c int 64-bit sizeof

我只是想知道我怎么知道我的笔记本电脑是64位还是32位机器。 (这是64)。

所以,我考虑过打印以下内容:

int main()
{
 printf("%d",sizeof(int));
}

结果是4,这看起来很奇怪(因为它是64位机器)

但是,当我打印出来时:

int main()
{
 printf("%d",sizeof(int*));
}

结果是8,这更有意义。

问题是:

由于我使用的是64位机器,不应该像int这样的基本类型应该使用8个字节

(64位),那个sizeof int应该是8?为什么不这样呢?

为什么int * size是8?

这里有点困惑,

所以提前谢谢。

5 个答案:

答案 0 :(得分:23)

不,sizeof(int)是实现定义的,通常是4个字节。

另一方面,为了处理超过4GB的内存(32位系统可以做到),你需要指针为8字节宽。 int*只是将地址保存在“内存中的某个地方”,而你只能用32位来处理超过4GB的内存。

答案 1 :(得分:16)

在任何64位C / C ++编译器上,指针的大小应为8字节,但对于int的大小则不一样。

wiki对此有一个很好的解释:

  

在许多用于C和C派生语言的编程环境中   64位机器,“int”变量仍然是32位宽,但很长   整数和指针是64位宽。这些被描述为具有   LP64数据模型。另一种选择是ILP64数据模型   其中所有三种数据类型都是64位宽,甚至SILP64在哪里   “短”整数也是64位宽。[引证需要]然而,在   大多数情况下所需的修改相对较小   直截了当,许多写得很好的程序都可以   在没有更改的情况下为新环境重新编译。另一个   替代方案是LLP64模型,它保持兼容性   将int和long都保留为32位的32位代码。 “LL”指的是   “long long integer”类型,在所有平台上至少为64位,   包括32位环境。

答案 2 :(得分:3)

sizeof(int)sizeof(int*)和“机器尺寸”虽然经常相互关联,但每个都可以独立地更小,相同或更大。关于唯一的C要求是它们至少是16位(左右) - 除此之外,它的编译器依赖于sizeof(int)sizeof(int*)

(虽然指针必须至少是一个int大小。嗯)

答案 3 :(得分:2)

程序员喜欢使用1,2,4和8字节或8,16,32和64位的整数类型。只有两个整数类型可能小于int:char和short。如果int是64位,那么你不可能拥有所有三种大小8,16和32位。这就是为什么编译器倾向于使int = 32位,因此你可以使char = 8位,short = 16位,int = 32位,long long = 64位,long = 32位或64位。

答案 4 :(得分:0)

因为size_t被定义为

typedef unsigned int size_t;

您应该使用%zu,%u或%lu而不是%d显示它。

printf("%zu\n", sizet);
printf("%u\n", sizet);
printf("%lu\n", sizet);