可能重复:
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;
我想知道是否可以保证,在32位和64位系统中,
sizeof(int)
总是等于sizeof(void*)
没有。
我需要知道是否总是保证
long int
可以将int
和void*
的比特一起容纳
没有。一个快速的证明是考虑许多现代平台上的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个字节。