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

C++ sizeof(int)是否始终等于sizeof(void*),c++,C++,可能重复: 我想知道是否可以保证在32位和64位系统中,sizeof(int)始终等于sizeof(void*)(即分别为32位和64位) 此外,我需要知道是否总是保证long int可以同时容纳int和void*的位,例如 long int lint = (((int)integer)<<sizeof(int)) | (void*)ptr; long int lint=((int)整数) 我想知道在32位和64位系统中,sizeof(int)始终等于sizeof(void*)

可能重复:

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

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

long int lint = (((int)integer)<<sizeof(int)) | (void*)ptr;
long int lint=((int)整数)
我想知道在32位和64位系统中,
sizeof(int)
始终等于
sizeof(void*)

没有

我需要知道是否总是保证
long int
可以同时容纳
int
void*
的位

No.Po.No.一个快速的证明是在许多现代平台上考虑<代码> SIEZOF(long int)=sieof(int)< /> >,可能包括您正在使用的。 更重要的问题是,为什么您认为您“需要知道”这一点;您提出这些问题的事实让我担心您的代码可能……不稳定

我想知道在32位和64位系统中,
sizeof(int)
始终等于
sizeof(void*)

没有

我需要知道是否总是保证
long int
可以同时容纳
int
void*
的位

No.Po.No.一个快速的证明是在许多现代平台上考虑<代码> SIEZOF(long int)=sieof(int)< /> >,可能包括您正在使用的。
更重要的问题是,为什么您认为“需要知道”这一点;您提出这些问题的事实让我担心您的代码可能会……不稳定。

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

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

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

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

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

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

最新的C99标准提供了一个
头,定义了一个
intptr\t
积分类型,保证与指针大小相同


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

最近的C99标准提供了一个
头,定义了一个
intptr\t
整数类型,保证与指针大小相同

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

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

没有

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

没有

您需要的是:std::intptr\t

sizeof(std::intptr_t) == sizeof(void*)
intptr_t被定义为一个大小足以容纳指针的整数

从技术上讲,它是本标准的可选部分。
但是您通常可以在头文件
中找到,请参见:
18.4.1头概要[cstdint.syn]

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

没有

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

没有

您需要的是:std::intptr\t

sizeof(std::intptr_t) == sizeof(void*)
intptr_t被定义为一个大小足以容纳指针的整数

从技术上讲,它是本标准的可选部分。

但是您通常可以在头文件
中找到,请参见:
18.4.1头概要[cstdint.syn]

long int
int
在许多平台上实际上具有相同的大小。首要原因是
((int)integer)保证sizeof(long int)>=sizeof(int)也许如果你告诉我们你真正想要完成什么,我们可以用更准确的答案来回答。@AndréCaron:“否”非常准确:)
long int
int
在许多平台上实际上大小相同。首要原因是
((int)integer)保证sizeof(long int)>=sizeof(int)也许如果你告诉我们你真正想要完成什么,我们可以用更准确的答案来回答。@AndréCaron:“不”非常准确:)唉,不-预处理器不知道什么东西的大小。我会编辑;谢谢。我个人不喜欢assert()正如我所看到的那样,如果非调试版本太频繁,为什么不
static\u assert
?这个假设在运行时不会改变。唉,不-预处理器不知道什么东西的大小。我会编辑;谢谢。我个人不喜欢assert()正如我所看到的,如果非调试版本太频繁,为什么不在运行时使用静态断言呢?这个假设在运行时不会改变。举一个第一个“否”的例子:在64位平台上使用gcc
sizeof(int)
是4(而
sizeof(void*)
当然是8)。举一个第一个“否”的例子:使用gcc
sizeof(int)
(int)
在64位平台上是4(而
sizeof(void*)
当然是8)。