使用long的一般规则

时间:2012-06-07 05:22:40

标签: c++ c

一位经验丰富的程序员(spoj,co​​dechef,topcoder等)告诉我,一般情况下,我可以使用int来获得高达10 ^ 9的值。

使用的一般规则是什么 签署了long int, unsigned long int, 签署long long int, unsigned long long int

7 个答案:

答案 0 :(得分:4)

这个问题的答案取决于平台(因为不同的平台可能有不同的整数大小)。您可以在http://en.cppreference.com/w/cpp/types/numeric_limits

找到相当完整的限制列表

答案 1 :(得分:3)

使用intlong的主要时间是与使用这些类型的API进行交互时。例如,错误代码和文件描述符的类型为intftell返回long。当您知道要处理的数字非常小并且有限时(即无法与完全控制之外的某些部分成比例),您也可以使用int作为索引/计数器。否则,当您需要能够存储特定已知值时,您应始终使用size_t来表示内存中对象的大小/索引/计数,以及来自stdint.h的精确或至少大小类型大小

如果你不能使用stdint.h(例如,在C89或旧的C ++实现上),你可以使用普通的旧类型:

  1. short可以存储至少-32767到32767的范围。
  2. unsigned short至少可以存储0到65536的范围。
  3. int可以存储至少-32767到32767的范围(以及符合POSIX标准的系统上的-2147483647到2147483647)。
  4. unsigned可以存储至少0到65536的范围(以及符合POSIX的系统上的0到4294967295)。
  5. long至少可以存储-2147483647到2147483647的范围。
  6. unsigned long可以存储至少0到4294967295的范围。

答案 2 :(得分:1)

您可以打开limits.h并自行推断规则:

#define LONG_MIN    (-2147483647L - 1) /* minimum (signed) long value */
#define LONG_MAX      2147483647L   /* maximum (signed) long value */
#define ULONG_MAX     0xffffffffUL  /* maximum unsigned long value */
#define LLONG_MAX     9223372036854775807i64       /* maximum signed long long int value */
#define LLONG_MIN   (-9223372036854775807i64 - 1)  /* minimum signed long long int value */
#define ULLONG_MAX    0xffffffffffffffffui64       /* maximum unsigned long long int value */

答案 3 :(得分:0)

根据您使用的libc,通常会有一些宏告诉您intlong int等的限制值。对于便携式示例,请查看由提供的限制宏。 glib

答案 4 :(得分:0)

您可能需要查看标准标题climits或limits.h

答案 5 :(得分:0)

作为一般规则,对于任何已签名的类型,如果类型大小为n位,则

Max Positive Value = 2^(n-1)-1 <br>
Max Negative Value = -2^(n-1)

同样,每个平台可能都有变化,您应该参考该平台中可用的limits.h来获取确切的值。

答案 6 :(得分:0)

这取决于您的可移植性限制。形式上,仅int 保证支持[-32767,32767]范围内的值,因此随时都可以 你需要更多,你应该使用long。实际上,很多程序 不需要移植到16位机器(今天非常罕见), 在大多数现代64位平台上,long将是64位,即 超过需要,并将减慢速度(如果只是因为 较贫穷的地方)。如果你可以假设int至少是32位,那就是 你应该在几乎所有地方使用什么,具体如下 例外:

  • 如果您关注实际的按位表示,使用按位&|^~,或者使用移位运算符,那么您默认情况下应使用unsigned类型unsigned int,但如果出现以下情况之一,则应使用其他尺寸。

  • 如果需要unsigned的模运算,请使用无符号类型。这是非常非常罕见的,但确实发生在计算哈希等事情上 码。

  • 如果你有真正的大表(向量或任何其他连续表示),你可以考虑short甚至signed char(或unsigned shortunsigned char,如果你关心按位表示)。我会使用普通char来表示除了字符以外的任何内容,因为它的签名是实现定义的。

  • 如果您需要表示大于2 ^ 31的值,请考虑long long。 (但是,在这种情况下,即使long long通常也不够大,而且您需要某种BigInteger类。)

作为一般规则,除int之外的任何内容都应该是例外。