对于可移植代码,我应该使用long-long还是int64_t
Should I use long long or int64_t for portable code?
我有一个用C和C++编写的开源代码库。我正在寻找一种保证至少为64位宽的整数类型,它可以在大多数操作系统X(英特尔,64位)和Linux上使用开源C和C++编译器进行可靠编译,而无需最终用户做太多额外工作。Windows和32位客户端支持目前并不重要。
我在OSX上做了一些测试,开发人员工具附带的最新GCC不支持C+11模式(因此似乎不能保证long long
的可用性)。Clang也不支持这一点,尽管在某个版本之后,如果启用C99模式,它支持long long
。
当可移植性是一个重要目标时,使用int64_t
代替long long
的一般建议是什么?使用格式说明符似乎很痛苦。
我是否可以可靠地将int64_t
强制转换为long long
(类似地,转换为与uint64_t
等效的unsigned
),以便将其与以long long
为参数的现有函数和库一起使用?(当然还有回来。)
从这个角度来看,如果我发布的代码需要Clang功能,而不是GCC,Clang会取代GCC成为Linux上的首选编译器吗?在大多数情况下,当向最终用户提供源代码时,这种编译器是我可以期待的吗?
基本上,我想向其他使用过这两种类型的可移植C和C++代码的开发人员征求一些建议,考虑到上述目标,他们可能会对什么是更好的长期方法提出一些建议。
类型long long
和unsigned long long
是标准C和标准C++类型,每个类型至少有64位。据我所知,所有编译器都提供这些类型,除非可能处于-pedantic
模式,但在这种情况下,int64_t
或uint64_t
也不适用于C++2011之前的编译器。在所有系统上,<stdint.h>
也可用。也就是说,据我所知,你怎么拼写这个类型并不重要。<stdint.h>
的主要目标是为特定数量的比特提供最佳匹配。如果您需要至少64位,但又想利用这种类型的快速实现,则可以使用<stdint.h>
或<cstdint>
中的int_least64_t
或uint_least64_t
(如果是后者,则名称在名称空间std
中定义)。
当可移植性是一个重要目标时,是否建议使用
int64_t
代替long long
?
如果编译器提供int64_t
而不是long long
,我会非常惊讶。
如果存在long long
,则它必须至少有64位,因此从(u)int64_t
转换为(unsigned) long long
是保值的。
如果您需要恰好为64位的类型,请使用(u)int64_t
;如果您需要至少为64位,则(unsigned) long long
和(u)int_least64_t
都很好。
使用int64_t。int64_t的意思是64位,无论你走到哪里,都会得到64位。long-long实际上和long一样依赖于实现。也就是说,long-long必须大于或等于long,但根据编译器和平台的不同,这可能会有所不同。
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 这句话是什么意思 - " vector<long long> distance(n, std::numeric_limits<long long>::max()); "?
- C ++分割错误,为什么使用"long long"我没有得到答案?
- 以0开头的值初始化long-long会导致奇怪的值
- "1L << count"是什么意思?如何使用超出"unsigned long long int? "范围的语句编号打印?
- 为什么我的函数返回 long long 返回 705032704?
- 如何在 Turbo C++ 3.2 编译器中使用 long long 关键字
- "How to use long long data-type rather than pointers data-type to modify other variables ?"
- 只读位置'__result.std::_Rb_tree_const_iterator<_Tp>::operator*<long long int>()'分配错误
- 没有匹配函数来调用"std::basic_ofstream<char>::write(std::string*, long long unsigned int)"
- 如何处理计算中的"unsigned long long int"?
- 将long-long的数组转换为字符串
- unsigned int/signed int/long-long:无法解释的输出
- "long"和"long int"以及"long long"与"long long int"有什么区别
- map(long long int,long long int)不适用于key=1000 000 000(在long l
- 如果在我的机器上 sizeof(long) == sizeof(long long),为什么它们不是同一类型?
- long long value in Visual Studio
- C++定义了long-long,但输出是有限的
- 对于可移植代码,我应该使用long-long还是int64_t