对于可移植代码,我应该使用long-long还是int64\t? 我有一个开源的代码库,它都是用C和C++编写的。我正在寻找一个整数类型,保证至少64位宽,这可以可靠地编译在大多数OS X(英特尔,64位)和Linux盒与开放源码C和C++编译器,没有太多额外的工作,在最终用户的一部分。目前,Windows和32位客户端支持并不重要

对于可移植代码,我应该使用long-long还是int64\t? 我有一个开源的代码库,它都是用C和C++编写的。我正在寻找一个整数类型,保证至少64位宽,这可以可靠地编译在大多数OS X(英特尔,64位)和Linux盒与开放源码C和C++编译器,没有太多额外的工作,在最终用户的一部分。目前,Windows和32位客户端支持并不重要,c++,c,types,int64,long-long,C++,C,Types,Int64,Long Long,我在OS X上做了一些测试,开发人员工具附带的最新GCC不支持C+11模式(因此似乎不能保证long的可用性)。Clang也不支持这一点,尽管在特定版本后,如果启用C99模式,它支持long 当可移植性是一个重要目标时,是否一般建议使用int64\u t代替long?使用格式说明符似乎很痛苦 我能否可靠地将int64_t强制转换为long(以及与uint64_t等效的unsigned)以将其与以long为参数的现有函数和库一起使用?(当然,还会回来。) 在这种想法下,如果我提供的代码不在GCC中

我在OS X上做了一些测试,开发人员工具附带的最新GCC不支持C+11模式(因此似乎不能保证
long
的可用性)。Clang也不支持这一点,尽管在特定版本后,如果启用C99模式,它支持
long

当可移植性是一个重要目标时,是否一般建议使用
int64\u t
代替
long
?使用格式说明符似乎很痛苦

我能否可靠地将
int64_t
强制转换为
long
(以及与
uint64_t
等效的
unsigned
)以将其与以
long
为参数的现有函数和库一起使用?(当然,还会回来。)

在这种想法下,如果我提供的代码不在GCC中,而需要使用Clang功能,那么Clang会取代GCC成为Linux上的首选编译器吗?在向最终用户提供源代码时,在大多数情况下,这是我可以期望的编译器吗

基本上,我想向其他开发人员提供一些建议,他们使用了两种类型的便携式C和C++代码,对于上面提到的目标,对于那些可能是更好的长期方法,他们可能会有一些建议。 当可移植性是一个重要目标时,是否一般建议使用
int64\u t
代替
long

如果编译器提供的是
int64\t
,而不是
long
,我会非常惊讶

如果存在
long long
,则它必须至少有64位,因此从
(u)int64_t
(无符号)long long
的强制转换是保值的


如果您需要一个完全正确的64位类型,则使用<代码>(u),即64位T < /C>,如果您需要至少64位,<代码>(未签名)长long < /> >完全一样,如<代码>(u),ItListAS64 64 t < /C> > < P> >长> < /代码>和<代码>无符号长long < /> >是标准C和标准C++类型,每个至少有64位。我所知道的所有编译器都提供这些类型,除非可能处于

-pedantic
模式,但在这种情况下,
int64\u t
uint64\u t
也不适用于C++2011之前的编译器。在所有系统上,
也可用。也就是说,就我所知,你如何拼写这个类型并不重要。
的主要目标是为特定数量的位提供最佳匹配。如果您至少需要64位,但也希望利用这种类型的快速实现,您可以使用
int\u least64\u t
uint\u least64\u t
from
(对于后者,名称在命名空间
std
中定义)。

使用int64\t。int64意味着64位,无论你走到哪里,你都会得到64位。long实际上与long一样依赖于实现。也就是说,long long必须大于或等于long,但这可能因编译器和平台而异。

gcc在c++11之前有
long long
作为扩展,所以只要不禁用gcc扩展,就可以在gcc上使用
long
(事实上,我不认为我已经使用/见过一个编译器很久没有提供long)请注意, Inth6xt 可以有基础类型<代码>长或长Lo/<代码>,如果需要重载,这可能会导致可移植性问题。还可以考虑TyPulf从平台到平台的简单更改。不同系统上的nt版本。请看,我肯定希望标准添加一个更大的类型,例如128或更多,考虑到现在大量使用加密技术,您需要这样一个类型,这样您就不必依赖许多库。我还没有看到关于这样一个类型的建议(
long
?)虽然我知道许多系统实际上通过SIMD支持支持128位类型:向WG14和/或WG21发送建议!
long
;支持128位整数的系统可以定义扩展整数类型,并根据这些类型定义
int128_t
uint128_t
至少64位的最快类型,
int\u fast64\u t
uint\u fast64\u t
会更好。标准中有一个保证,即
long-long
必须至少是64位。它可能更长,但不能更短。因此,不,它不像
long
那样依赖于实现:对于
long
,规则是至少,它只需要与
int
一样长,只需要大于
char
。因此,您可以拥有一个
sizeof(long)==2
的平台,但是
sizeof(long-long)>=8
在每个平台上都必须是真的。谢谢。知道这一点很好。但至少sizeof(long-long)仍然依赖于平台,获得一致64位的唯一方法是int64_t。是的,但问题是关于“保证至少64位宽的整数类型”.这正是
long
所提供的功能。
long
作为标准的一部分是可移植的。
long
如果没有
long
的话,你会非常喜欢没有
的>int64_t