long long in C++
long long in C++
我正在创建一个游戏引擎,它将支持微软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时遇到了奇怪的问题。
- 如何在 C 中正确使用 libiconv 使其不会报告"Arg list too long"?
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 错误:隐式转换更改符号:'int'到'unsigned long'
- 这句话是什么意思 - " vector<long long> distance(n, std::numeric_limits<long long>::max()); "?
- C ++分割错误,为什么使用"long long"我没有得到答案?
- 对 '(const Y) (int&, std::mersenne_twister_engine<long unsigned int,
- 从 long 转换C++位集构造函数的复杂性是多少?
- 自动类型默认为 int 而不是 long
- 错误:'class std::unique_ptr<std::set<long unsigned int> >'没有名为 'size' 的成员
- C++ 我应该如何解释函数参数long(*pPointer)(OtherClass *const, long)?
- 以0开头的值初始化long-long会导致奇怪的值
- "1L << count"是什么意思?如何使用超出"unsigned long long int? "范围的语句编号打印?
- cudaMallocManaged with vector<complex<long double> > C++ - NVIDIA CUDA
- 为什么我的函数返回 long long 返回 705032704?
- C++11 模板函数"implicity"将位集<N>转换为"unsigned long"
- 替换 c++ 中的 c 样式强制转换 (long&)
- 如何在 Turbo C++ 3.2 编译器中使用 long long 关键字
- Visual studio 2013 和 g++ 7.1 中将 int 和 long 类型相乘时的 c++ 差异行为