long long in C++

long long in C++

本文关键字:long C++ in      更新时间:2023-10-16

我正在创建一个游戏引擎,它将支持微软Windows X86和X64版本。当我创建自定义类型时,如果版本是X86,我是否必须指定"typedef unsigned long"answers"typedef unsigned long",当版本是X64时?

#include <cstdint>

,并使用uint32_t, uint64_t

long long类型在所有支持它的编译器上都是64位。(C/c++标准规定它必须至少是64位;我认为目前还没有任何系统支持更大的类型。)如果你只想要一个64位的整型定义,你可以使用long long而不用担心。

C99和c++ 11标准提供了一个新的头文件

由于64位Windows使用LLP64数据模型和Visual c++编译器,当然,您应该安全地使用两个版本的typedef unsigned long long,因为在LLP64 long仍然是32位。

long long在大多数c++编译器中已经工作了几十年(由于C的传统),尽管它不是标准的一部分。

有一个小问题:如果你在-pedantic警告级别用GNU c++编译long long的c++代码,它会抱怨long long不是标准的c++。这是真的。事实上,long long也是有效的。在GNU c++上。以及其他编译器。这并不一定是一个问题,除非您有时会遇到强迫您盲目启用所有编译器警告选项并修复所有出现的问题的人。

有趣的是,与此同时,GNU c++允许你毫无怨言地使用uint64_t。这也是C语言,而不是c++,只是它的可移植性较差,因为编译器供应商实现C99的速度很慢。

下面是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;

我们可以看到unsigned __int64和__int64在windows上使用

尝试boost integer.hpp。它有uint64_t,保证在所有操作系统上都是无符号64位。

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

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

相关文章: