获取C ++中最大的有符号整数类型

时间:2015-08-05 16:09:09

标签: c++ c signed unsigned-integer size-t

让我们说我必须接受一个大小作为处理数组的接口的参数。对于e.x。

void doSomethingRelatedToArrays(const size_t length)

在这里,我使用size_t并考虑以下因素:

  • 长度必须始终为正
  • size_t始终是typedef-ed到系统中最大的无符号整数类型。 std :: size_t可以存储任何类型的理论上可能的对象的最大大小。

但是,我不应该在我的接口中使用无符号类型,因为客户端可以传入负数,这是隐式转换为无符号数,我没有办法在我的方法中验证它。请参阅Scott Meyer关于此主题的文章here

所以,我应该将有符号整数类型传递给API。但是如何在系统中获得最大的有符号整数类型?是否有任何类似于size_t的typedef被签名?或者我应该只使用size_t?

4 个答案:

答案 0 :(得分:5)

签名的等效size_t只是ssize_t,但是这种类型在C99标准中没有定义,即使许多编译器都知道它。

对于C99标准,最大有符号整数类型定义为intmax_t

参考:7。Library / 7.18整数类型/ 7.18.1.5最大宽度整数类型

答案 1 :(得分:3)

要使用的标准类型是std::intmax_t,它在<cstdint>中定义。要获得最大值,您可以使用std::numeric_limits<intmax_t>::max()

示例代码:

#include <cstdint>
#include <iostream>
#include <limits>

int main(int argc, char* argv[]) {
    std::cout << "max size = " << std::numeric_limits<intmax_t>::max() << std::endl;
}

答案 2 :(得分:2)

  

但是如何才能获得系统中最大的有符号整数类型?

在C ++ 11的<cstdint>中,您可以找到类型intmax_t,它是在C标准(7.20.1.5)之后定义的:

  

以下类型指定能够执行的有符号整数类型   表示任何有符号整数类型的任何值

  

是否有任何类似于size_t的typedef被签名?

不,不是在C ++标准中。 POSIX定义ssize_t

  • 并不意味着取代size_t(其本身也受到POSIX的限制)
  • 不是要存储/传递负值,而是表示错误:
      

    ssize_t应能够存储至少在[-1,{SSIZE_MAX}]范围内的值。

  

所以,我应该将有符号整数类型传递给API。 (...)或者我应该   只需使用size_t?

如果您的接口是为了处理C ++数组,那么size_t是标准保证能够保存任何可能的数组索引的唯一类型。使用任何其他类型(理论上)可能无法处理所有数组(甚至在您链接的文章中都会注明)。

因此,使用size_t进行索引是常见且习惯的 - 并且被许多库(包括STL)使用。

答案 3 :(得分:1)

最近C和C ++标准中最大的有符号整数类型是long long。在类型宽于long long之前,您始终可以使用它。如果您希望更加面向未来,请使用intmax_t

  

size_t始终是系统

中最大的无符号整数类型的类型

这是不正确的。 32位系统中的size_t通常也是32位,这显然不是最宽的类型。它只能保证足够大,以表示系统中最大对象的大小。

如果需要size_tptrdiff_t可以用作已签名的对应方。但它也不是最大的类型。

  

对于char以下的PTRDIFF_MAX个数组,std::ptrdiff_t充当std::size_t的已签名对应数据:它可以存储任何类型数组的大小,并且大多数平台,与std::intptr_t

同义

http://en.cppreference.com/w/cpp/types/ptrdiff_t