unsigned long long 与 uint64_t 冲突? [复制]

Posted

技术标签:

【中文标题】unsigned long long 与 uint64_t 冲突? [复制]【英文标题】:unsigned long long conflict with uint64_t? [duplicate] 【发布时间】:2015-08-25 07:50:25 【问题描述】:

我们对一些类型参数使用模板特化

class my_template_class<uint64_t M>: public my_template_class_base<uint64_t> 
 ....


class my_template_class<unsigned long long,M>: public my_template_class_base<unsigned long long> 
 ....

这与使用 gcc 的 64 位编译完美配合。而当我们尝试 32 位模式时,它会报告上述两个类的“先前定义”。

那么unsigned long long在32位编译中与uint64_t相同,但在64位编译中不一样?

编译区别在于CXX标志-m32-m64

【问题讨论】:

@FrédéricHamidi:不太可能;我从没见过有 128 位 unsigned long long 的系统。 uint64_t 实际编译成什么?我手头没有 GCC,但您可以检查 stdint 标头。可能会提供一些关于编译器实际看到的线索。 我很确定在 64 位平台上,uint64_t 被定义为 unsigned long,因此不会与 unsigned long long 冲突,而在 32 位平台上,uint64_t必须是unsigned long long,产生你的错误 @NiBZ 错误。 Windows 使用LLP64 model,因此即使在 64 位 Windows 上,long 仍然是 32 位,uint64_t 必须定义为 unsigned long long @LưuVĩnhPhúc 正如 OP 在他的消息中提到的 gcc,我假设他正在构建一个类 Unix 平台(即 LP64)。应该在我的帖子中提到它。 【参考方案1】:

所以unsigned long long在32位编译中与uint64_t相同,但在64位编译中不一样?

是的。

在 32 位模式下,long 很可能是 32 位,long long 很可能是 64 位。在 64 位模式下,两者都可能是 64 位。

在 32 位模式下,编译器(更准确地说是 &lt;stdint.h&gt; 标头)将 uint64_t 定义为 unsigned long long,因为 unsigned long 不够宽。

在64位模式下,将uint64_t定义为unsigned long

可以在两种模式下都将其定义为unsigned long long。选择是任意的;所要求的只是它必须是 64 位类型。

一般来说,&lt;stdint.h&gt; 中定义的每个整数类型都是一些具有适当特征的预定义类型的 typedef。您不能假设它们中的任何一个都与预定义的类型不同。

【讨论】:

在 Windows 上 uint64_t 必须定义为 unsigned long long 只要只有 32 位 en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models @LưuVĩnhPhúc:过去被定义为__uint64。通常不确定具有相同表示的两种类型是否实际上是相同的类型;例外是 charsigned charunsigned char,它们被定义为 3 种类型和 2 种表示形式。 @MSalters:需要明确的是,所有预定义类型都是不同的,无论其表示形式如何。例如,intlong 是不同的类型,即使它们具有相同的大小和表示形式。如果您指的是标准标头中定义的类型,例如 int32_t,那么您是对的。【参考方案2】:

这是来自 GCC 4.8 的 stdint.h

#if __WORDSIZE == 64
typedef unsigned long int   uint64_t;
#else
__extension__
typedef unsigned long long int  uint64_t;
#endif

所以:

那么 unsigned long long 在 32 位编译中与 uint64_t 相同,但在 64 位编译中不一样?

是的。

【讨论】:

是的,对于 GCC。不要以为到处都是真的。例如,Visual Studio 有一个无条件的 typedef unsigned long long uint64_t;

以上是关于unsigned long long 与 uint64_t 冲突? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MongoDB 文档中存储 unsigned long long (uint64_t) 值?

OSX vs Linux:如何处理 unsigned long 和 uint64_t?

在CUDA中将类型转换为unsigned long long?

C51程序编写的时候要注意unsigned long的问题

unsigned long long类型与long long类型

unsigned char 与unsigned long互换