我只是想知道我怎么知道我的笔记本电脑是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?
这里有点困惑,
所以提前谢谢。
答案 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);