0

一位经验丰富的程序员(spoj、codechef、topcoder 等)告诉我,一般来说,人们可以将 int 用于高达 10^9 的值。

使用有符号长整数、无符号长整数、有符号长整数、无符号长整数的一般规则是什么

4

7 回答 7

4

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

于 2012-06-07T05:27:07.397 回答
3

使用的主要时间是当您与使用这些类型的 API 交互时intlong例如,错误代码和文件描述符具有类型intftell返回longint当您知道要处理的数字非常小且有界(即不能与您完全控制之外的事物成比例地增长)时,您也可以将其用于索引/计数器。否则,您应该始终使用内存中对象的大小/索引/计数,以及当您需要能够存储特定已知大小的值时的size_t精确或至少大小类型。stdint.h

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

  1. short至少可以存储 -32767 到 32767 的范围。
  2. unsigned short至少可以存储 0 到 65536 的范围。
  3. int至少可以存储 -32767 到 32767 的范围(以及 -2147483647 到 2147483647 在符合 POSIX 的系统上)。
  4. unsigned至少可以存储 0 到 65536 的范围(以及 0 到 4294967295 在符合 POSIX 的系统上)。
  5. long至少可以存储 -2147483647 到 2147483647 的范围。
  6. unsigned long至少可以存储 0 到 4294967295 的范围。
于 2012-06-07T05:27:08.863 回答
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 */
于 2012-06-07T05:27:00.637 回答
0

根据您使用的 libc,通常有一些宏会告诉您 an int,等的限制值。对于可移植的示例,请查看gliblong int提供的限制宏。

于 2012-06-07T05:27:24.300 回答
0

您可能想查看标准头文件climits或 limits.h

于 2012-06-07T05:27:43.357 回答
0

作为一般规则,对于任何带符号的类型,如果类型大小为 n 位,则

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

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

于 2012-06-07T05:27:46.003 回答
0

这取决于您的可移植性限制。形式上,anint只保证支持范围内的值[-32767,32767],所以当你需要更多时,你应该使用long. 实际上,很多程序不需要移植到 16 位机器(今天非常罕见),而在大多数现代 64 位平台上,long将是 64 位,这超出了需要,并且会减慢速度(如果只是因为地势较差)。如果您可以假设int至少是 32 位,那么您几乎应该在任何地方使用它,但以下情况除外:

  • 如果您关心实际的按位表示,使用按位&、、|^~移位运算符,则默认情况下应使用unsigned类型unsigned int,但如果发生以下情况之一,则应使用其他大小。

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

  • 如果您有非常大的表(向量或任何其他连续表示),您可能会考虑shortor 甚至signed char(或者unsigned shortor unsigned char,如果您关心按位表示)。除了字符,我不会使用 plain ,因为它的符号是实现定义的。char

  • 如果您需要表示大于 2^31 的值,请考虑long long. (然而,long long在这种情况下,通常甚至不够大,你需要某种BigInteger类。)

作为一般规则,任何事情都int应该是例外。

于 2012-06-07T07:50:09.883 回答