我应该将哪种数据类型用于通用整数?

时间:2014-07-27 19:52:13

标签: c++

C ++中的通用整数应该使用什么数据类型?

显而易见的答案是int,这在16世纪16位机器上通常是16位而32位机器上通常是32位的情况下是有意义的。但现在64位代码变得越来越普遍,但int在这些编译器上通常是32位。因此,我们不能假设int必然是该系统的“最快”或最大类型。

另一个问题是从数据结构和文件的大小传播64位值。我知道你可以将这些值存储在一个32位的int中,并且如果大小不会太大则可以使用它。但我想编写可以处理最大数据大小的代码,如果这是用户想要的。如果用户打开一个5gb的文件并想要整个内存中的内容,我不希望我的代码死掉,因为大小存储在某个地方int。有一天,16 + gb ram系统将成为常态,我希望我的代码仍能正常工作。

我知道存在vector<T>::size_type等类型来存储该数据。但是,如果大小数据可以来自几种不同的容器和流类型呢?我应该对可能存储大小信息的所有整数使用size_t吗?

所以我不得不得出结论我应该使用size_t数据类型(或等效的签名,我现在最多可以使用每个数据结构9,223,372,036,854,775,807字节),而不是int,用于一般用途,但这不是我在实践中观察到的,int仍然常用。

我应该使用什么整数数据类型进行通用计算?这样做的技术原因是什么?

2 个答案:

答案 0 :(得分:2)

根据情况,您使用不同的整数。通常,有两大类整数 - 这些整数与程序建模的数据(即域数据)有关,而这些与程序本身的构造有关。

来自程序域的整数(例如用户数据,程序收集或计算的数据等)应该用提供特定大小的类型表示。在C ++中,这些类型在<cstdint> header中定义。例如,如果您需要可在所有平台上移植的带签名32位类型,请使用int32_t;如果您需要64位无符号数,请使用uint64_t,依此类推。

如果您关注执行速度,请使用带fastN_t后缀的整数类型,例如: uint_fast16_t表示快速的16位无符号整数。

当您获取数据结构的大小或减去指针时,会创建与程序构造相关的整数。使用size_t表示大小,ptrdiff_t表示指针差异。

答案 1 :(得分:1)

int是“通用目的”。您应该使用int,除非有理由不这样做。实际上,除了int之外,您使用除int之外的任何其他信号,这些信息都会向读取您的代码的人发出“通用计算”信号。它甚至在标准本身中也是如此,

  

普通fseek具有建议的自然尺寸   执行环境的架构44;提供其他有符号整数类型以满足特殊要求   需要。

如果要索引到可能非常大的文件,则不再进行通用计算。 long采用int类型的参数,而不是long。您将使用long,因为它是正确的“通用”整数类型,但因为您有“特殊需要”。

如果你使用long long或{{1}}来处理所有事情,那么你会让人感到困惑。