C++ Visual Studio 编译器中的 `LL` 与 `i64` 后缀
`LL` vs `i64` suffix in C++ Visual Studio compiler
我正在尝试重构旧的 C++ 代码。在某些时候我有这样的东西:
#if defined(WIN32) && !(defined(__CYGWIN__) || defined(__MINGW32__))
# define I64_CONST(X) X ## i64
#else
# define I64_CONST(X) X ## LL
#endif
所以为了在代码中定义 64 位文字,有类似的东西:
(uint32_t)((data_in >> 32) & I64_CONST(0x00000000ffffffff));
这是为了在 Microsoft 编译器中使用 i64
后缀,在其他编译器中使用 LL
。因为我正在为 C++17 调整它并且我们的最低要求是使用 Visual Studio 2019,是否可以删除它并在任何地方使用 LL
,或者是否存在一些问题并且它是更好地保持编译器之间的区别?
是的,long long
是一个 new type since C++11,它至少包含 64 位,因此它可以用于您的文字(除非源代码使用二进制补码并且编译器使用一个 complement/sign-magnitude 然后 -263 不适合)
另一种方法是使用<cstdint>
中的INT64_C
,这也是在C++11
中引入的
#define I64_CONST INT64_C
auto v = INT64_C(0xFFFF0000FFFF0000);
见
我正在尝试重构旧的 C++ 代码。在某些时候我有这样的东西:
#if defined(WIN32) && !(defined(__CYGWIN__) || defined(__MINGW32__))
# define I64_CONST(X) X ## i64
#else
# define I64_CONST(X) X ## LL
#endif
所以为了在代码中定义 64 位文字,有类似的东西:
(uint32_t)((data_in >> 32) & I64_CONST(0x00000000ffffffff));
这是为了在 Microsoft 编译器中使用 i64
后缀,在其他编译器中使用 LL
。因为我正在为 C++17 调整它并且我们的最低要求是使用 Visual Studio 2019,是否可以删除它并在任何地方使用 LL
,或者是否存在一些问题并且它是更好地保持编译器之间的区别?
是的,long long
是一个 new type since C++11,它至少包含 64 位,因此它可以用于您的文字(除非源代码使用二进制补码并且编译器使用一个 complement/sign-magnitude 然后 -263 不适合)
另一种方法是使用<cstdint>
中的INT64_C
,这也是在C++11
#define I64_CONST INT64_C
auto v = INT64_C(0xFFFF0000FFFF0000);
见