sizeof(int)总是等于sizeof(void *)

时间:2012-02-11 21:59:08

标签: c++

  

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

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

此外,我需要知道是否始终保证long int可以同时容纳intvoid*的位,例如。

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

4 个答案:

答案 0 :(得分:7)

  

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

没有

  

我需要知道是否始终保证long int能够同时容纳intvoid*的位

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

更重要的问题是为什么你认为你“需要知道”这个;你问这些问题的事实让我担心你的代码很可能......摇摇晃晃。

答案 1 :(得分:2)

int的大小取决于实现,虽然它可能在许多系统中等于指针的大小,但是不能保证。

如果您决定需要依赖于此的代码,则可以包含以下内容:

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

  

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

没有

  

此外,我需要知道是否始终保证long int可以容纳int和void *的位

没有

您要找的是:std :: intptr_t

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

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

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