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);