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

我只是想知道我怎么知道我的笔记本电脑是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 *大小是8?

这里有点困惑,

所以,提前谢谢。

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

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

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

维基对此有一个很好的解释:

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

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

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

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

因为size_t被定义为

 typedef unsigned int size_t; 

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

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