sizeof(int)是否始终等于sizeof(void*)

Is sizeof(int) always equal to sizeof(void*)

本文关键字:sizeof void int 是否      更新时间:2023-10-16

可能重复:
sizeof(int)==sizeof(void*)?

我想知道是否可以保证,在32位和64位系统中,sizeof(int)总是等于sizeof(void*)(即分别为32和64位)。

此外,我需要知道是否总是保证long int可以将intvoid*的比特容纳在一起,例如

long int lint = (((int)integer)<<sizeof(int)) | (void*)ptr;

我想知道是否可以保证,在32位和64位系统中,sizeof(int)总是等于sizeof(void*)

没有。

我需要知道是否总是保证long int可以将intvoid*的比特一起容纳

没有。一个快速的证明是考虑许多现代平台上的sizeof(long int) == sizeof(int),可能包括您正在使用的平台。

更重要的问题是为什么你认为你"需要知道"这一点;你问这样的问题让我担心你的代码可能是。。。摇摆不定。

int的大小取决于实现,尽管在许多系统中它可能等于指针的大小,但无法保证。

如果你决定你需要代码来依赖它,你可以包括一些东西,比如:

if (sizeof(int) != sizeof(void *))
{
    fprintf(stderr, "ERROR: size assumptions are invalid; this program cannot continue.n");
    exit(-1);
}

我想知道是否可以保证,在32位和64位系统中,sizeof(int)总是等于sizeof(void*)(即分别为32和64位)。

没有。

此外,我需要知道是否总是保证长int可以同时容纳int和void*的位

没有。

您要查找的是:std::intptr_t

sizeof(std::intptr_t) == sizeof(void*)

std::intptr_t被定义为一个大小足以容纳指针的整数。

从技术上讲,它是标准的可选部分
但您通常可以在头文件<cstdint>中找到请参阅:18.4.1 Header <cstdint> synopsis [cstdint.syn]

最近的C99标准提供了一个<stdint.h>标头,定义了一个保证与指针大小相同的intptr_t积分类型。

在我的Debian/AMD64/Sid上,sizeof(int)是4个字节,但sizeof(void*)sizeof(intptr_t)sizeof(long)都是8个字节。