C++ C+中的long+;

C++ C+中的long+;,c++,types,C++,Types,我正在创建一个游戏引擎,它将支持MicrosoftWindowsx86和X64版本。创建自定义typedef时,如果版本为X86,是否必须指定“typedef unsigned long”,如果版本为X64,是否必须指定“typedef unsigned long” #include <cstdint> 并使用uint32\u t,uint64\u t等。在所有支持它的编译器上,long-long类型为64位。(C/C++标准规定它必须至少为64位;我认为目前还没有任何系统支持更

我正在创建一个游戏引擎,它将支持MicrosoftWindowsx86和X64版本。创建自定义typedef时,如果版本为X86,是否必须指定“typedef unsigned long”,如果版本为X64,是否必须指定“typedef unsigned long”
#include <cstdint>

并使用
uint32\u t
uint64\u t
等。在所有支持它的编译器上,long-long类型为64位。(C/C++标准规定它必须至少为64位;我认为目前还没有任何系统支持更大的类型。)如果您只需要64位整数typedef,您可以使用long-long而不用担心

C99和C++11标准提供了一个新的标头,或者已经有一组固定大小的typedef,因此您可以只使用uint64\t。VisualStudio2010支持这一点,但我认为VS2008不支持

C和C++标准只指定标准整数类型的最小大小:

  • 字符被指定为至少8位
  • short至少指定为16位
  • int被指定为至少16位
  • long被指定为至少32位
  • long long指定为至少64位

由于64位Windows使用LLP64数据模型和Visual C++编译器,当然,对于两个版本,使用代码< Type无符号长long < /代码>应该是安全的,因为LLP64 <代码> long < /代码>仍然是32位。

< P>这是QT源代码的代码片段:

#if defined(Q_OS_WIN) && !defined(Q_CC_GNU) && !defined(Q_CC_MWERKS)
#  define Q_INT64_C(c) c ## i64    /* signed 64 bit constant */
#  define Q_UINT64_C(c) c ## ui64   /* unsigned 64 bit constant */
typedef __int64 qint64;            /* 64 bit signed */
typedef unsigned __int64 quint64;  /* 64 bit unsigned */
#else
#  define Q_INT64_C(c) static_cast<long long>(c ## LL)     /* signed 64 bit constant */
#  define Q_UINT64_C(c) static_cast<unsigned long long>(c ## ULL) /* unsigned 64 bit constant */
typedef long long qint64;           /* 64 bit signed */
typedef unsigned long long quint64; /* 64 bit unsigned */
#endif

typedef qint64 qlonglong;
typedef quint64 qulonglong;
#如果定义了(Q_OS___WIN)&&!已定义(Q_CC_GNU)&!已定义(Q_CC_MWERKS)
#定义Q_INT64_C(C)C#i64/*有符号64位常量*/
#定义Q_UINT64_C(C)C##ui64/*无符号64位常量*/
typedef__int64qint64;/*64位有符号*/
typedef unsigned__int64quit64;/*64位无符号*/
#否则
#定义Q_INT64_C(C)static_cast(C##LL)/*有符号64位常量*/
#定义Q_UINT64_C(C)静态_强制转换(C##ULL)/*无符号64位常量*/
typedef long long qint64;/*64位有符号*/
typedef无符号长五分位数64;/*64位无符号*/
#恩迪夫
类型DEF qint64 qlonglong;
曲隆龙64型;

我们可以看到,在Windows上使用了未签名的γ-INT64和μ-INT64。在大多数C++编译器中(C继承),已经长了几十年的时间了。p> <> P>有一点小缺点:如果你在C++代码> >代码中使用C++代码,在GNOUC+-Cudio> <代码>警告级别,它会抱怨<代码>长Lo/<代码>不是标准C++。这是真的。实际上,

long-long
也确实有效。关于GNU C++。和其他编译器。这不一定是一个问题,除非您有时会遇到一些人强迫您盲目地启用所有编译器警告选项,并修复所有出现的问题

<>有趣的是,GNU C++将让你不用抱怨就使用<代码> UTIN 64×T/<代码>。这也是C,C++,除了它是不太便携的,因为编译器厂商执行C99的速度慢。

< P>尝试。它有uint64,保证在所有操作系统上都是无符号的64位。

关于Visual Studio(不同版本),这很有帮助


我从来不知道long在64位Windows上只有32位。。。直到我在msSinceEpoch上遇到奇怪的问题。

我已经知道了这一点,但我想定义自己的,而不必担心外部引用。请注意,这需要C++0x支持。Boost提供了一个类似的标题,这是个坏主意。真的,真的,真的。。。使用。如果您定义自己的类型,您会让其他人阅读您的代码,一旦您决定移植到其他平台,您就会遇到麻烦。@jsvcycling:它不是外部引用;这是标准图书馆。这就像说“std::vector”或“size_t”是一个“外部引用”。@jsvcycling:在这种情况下,这应该是您提到的第一条信息。在这里,我们倾向于推荐使用标准库,除非给出不推荐的理由。另外,我还以为GCC喜欢在64位编译器上生成
int
64位?我从来没有见过64位
int
。基本上,x64中唯一改变大小的是指针大小。对不起,在标准中哪里提到long long必须至少是64位?我甚至在
7.1.5.2简单类型说明符表中也找不到它。(即,在2003 C++标准中)它不是在2003 C++标准中。这是1999 C标准和2011 C++标准。你在实践中是什么意思?在现代DSP上,字符通常是32位。在16位处理器上,
int
为16位。你的答案严重偏向桌面。这是老生常谈
long-long
unsignedlong-long
也适用于编译器的多个版本。