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 位模式下,编译器(更准确地说是 <stdint.h>
标头)将 uint64_t
定义为 unsigned long long
,因为 unsigned long
不够宽。
在64位模式下,将uint64_t
定义为unsigned long
。
它可以在两种模式下都将其定义为unsigned long long
。选择是任意的;所要求的只是它必须是 64 位类型。
一般来说,<stdint.h>
中定义的每个整数类型都是一些具有适当特征的预定义类型的 typedef。您不能假设它们中的任何一个都与预定义的类型不同。
【讨论】:
在 Windows 上uint64_t
必须定义为 unsigned long long
只要只有 32 位 en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models
@LưuVĩnhPhúc:过去被定义为__uint64
。通常不确定具有相同表示的两种类型是否实际上是相同的类型;例外是 char
与 signed char
或 unsigned char
,它们被定义为 3 种类型和 2 种表示形式。
@MSalters:需要明确的是,所有预定义类型都是不同的,无论其表示形式如何。例如,int
和 long
是不同的类型,即使它们具有相同的大小和表示形式。如果您指的是标准标头中定义的类型,例如 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?