如果我这样做:
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位机器上说?
答案 0 :(得分:3)
这些值取决于实现(请参阅std::numeric_limits
here的文档。)但是,标准保证它们能够代表值达到某个值(请参阅here具体细节。)
只要常量落在该类型的允许可表示值范围内,使用自己的常量就不应该引起问题。在您的示例中,MAX_UNSIGNED_SHORT
和MAX_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,必须是特定大小。