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位平台上使用gccsizeof(int)
是4(而sizeof(void*)
当然是8)。举一个第一个“否”的例子:使用gccsizeof(int)
(int)
在64位平台上是4(而sizeof(void*)
当然是8)。