是#include <limits>跨平台?

时间:2015-06-07 02:23:25

标签: c++ c++11

如果我这样做:

int imin = std::numeric_limits<int>::min(); 
int imax = std::numeric_limits<int>::max();

无论哪个编译器/操作系统,我都会获得相同的值,或者这些值是否依赖于实现?

如果它们是编译器/ os依赖的,则使用我自己的常量:

  static unsigned short MAX_UNSIGNED_SHORT = 65535;
  static uint64_t MAX_UNSIGNED_64LONG = 18446744073709551615u;
导致问题;在32位机器上说?

2 个答案:

答案 0 :(得分:3)

这些值取决于实现(请参阅std::numeric_limits here的文档。)但是,标准保证它们能够代表值达到某个值(请参阅here具体细节。)

只要常量落在该类型的允许可表示值范围内,使用自己的常量就不应该引起问题。在您的示例中,MAX_UNSIGNED_SHORTMAX_UNSIGNED_64LONG的值都属于各自类型的值。他们应该没事。

另一方面,如果您使用fixed width integer类型,std::numeric_limits::max的结果应该在specfic类型的实现中保持不变。 (例如std::numeric_limits<uint16_t>::max()将跨平台返回相同的值,std::numeric_limits<uint64_t>::max()将跨平台返回相同的值,但std::numeric_limits<uint16_t>::max() != std::numeric_limits<uint64_t>::max()。) 但是,正如@rci指出的那样,根据标准,固定宽度类型是可选的,因此它们不能保证在所有实现中都存在。

答案 1 :(得分:2)

它们是依赖于实现的,int由标准定义为至少与short一样长,并且具有至少16位。其他一切都由实施决定。现在,你通常会看到32位整数。 http://www.cplusplus.com/doc/tutorial/variables/

很难说它是否会引起问题,这取决于细节。您可以安全地使用16位的值。手工定义自己的限制通常不是一个好主意。

老实说,最好的办法是#include cstdint,只需使用固定大小的类型,例如: int32_t,必须是特定大小。