32位和64位架构

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了32位和64位架构相关的知识,希望对你有一定的参考价值。

在这里,结果结果是3和1,这对我来说很有意义。但是,当代码在64位架构上运行时,结果变为3和2.你能解释为什么会发生这种情况吗?

#include <stdio.h>

void print(int* a)
{
    int len = sizeof(a)/sizeof(a[0]);
    printf("%d", len);
}

int main(void) {
    int a[]= {11, 22, 33};
int len = sizeof(a)/sizeof(a[0]);
printf("%d
", len);
    print(a);
}
答案

64位上的sizeof(int*)将是8个字节,而32位上只有4个字节。在两种情况下,sizeof(int)可能是32位。

所以对于32位的情况:

int len = sizeof(a)/sizeof(int);    // (12/4) = 3
int len = sizeof(int*)/sizeof(int); //  (4/4) = 1

对于64位案例:

int len = sizeof(a)/sizeof(int);    // (12/4) = 3
int len = sizeof(int*)/sizeof(int); //  (8/4) = 2

也许你对这部分感到困惑:

void print(int* a)
{
    int len = sizeof(a)/sizeof(a[0]);
    ...
}

上面的a降级为指针,int*。在它上面使用sizeof会给你指向数组的指针的大小,而不是数组的内容。

以上是关于32位和64位架构的主要内容,如果未能解决你的问题,请参考以下文章

如何制作同时支持 32 位和 64 位架构的 Android 应用程序?

如何使代码兼容 32 位和 64 位

在 .NET 项目中同时引用 32 位和 64 位 dll 并单击一次 [重复]

如何在我的应用程序中包含 64 位和 32 位本机代码

关于ARM架构的一些知识

让 qmake 与 32 位和 64 位并排安装一起工作