一位经验丰富的程序员(spoj、codechef、topcoder 等)告诉我,一般来说,人们可以将 int 用于高达 10^9 的值。
使用有符号长整数、无符号长整数、有符号长整数、无符号长整数的一般规则是什么
这个问题的答案取决于平台(因为不同的平台可能有不同大小的整数)。您可以在http://en.cppreference.com/w/cpp/types/numeric_limits找到相当完整的限制列表
使用的主要时间是当您与使用这些类型的 API 交互时int
。long
例如,错误代码和文件描述符具有类型int
和ftell
返回long
。int
当您知道要处理的数字非常小且有界(即不能与您完全控制之外的事物成比例地增长)时,您也可以将其用于索引/计数器。否则,您应该始终使用内存中对象的大小/索引/计数,以及当您需要能够存储特定已知大小的值时的size_t
精确或至少大小类型。stdint.h
如果你不能使用stdint.h
(例如,在 C89 或旧的 C++ 实现上),你可以使用普通的旧类型:
short
至少可以存储 -32767 到 32767 的范围。unsigned short
至少可以存储 0 到 65536 的范围。int
至少可以存储 -32767 到 32767 的范围(以及 -2147483647 到 2147483647 在符合 POSIX 的系统上)。unsigned
至少可以存储 0 到 65536 的范围(以及 0 到 4294967295 在符合 POSIX 的系统上)。long
至少可以存储 -2147483647 到 2147483647 的范围。unsigned long
至少可以存储 0 到 4294967295 的范围。您可以自己打开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 */
根据您使用的 libc,通常有一些宏会告诉您 an int
,等的限制值。对于可移植的示例,请查看gliblong int
提供的限制宏。
您可能想查看标准头文件climits或 limits.h
作为一般规则,对于任何带符号的类型,如果类型大小为 n 位,则
Max Positive Value = 2^(n-1)-1 <br>
Max Negative Value = -2^(n-1)
同样,每个平台可能都有变化,您应该参考该平台中可用的 limits.h 以获得准确的值。
这取决于您的可移植性限制。形式上,anint
只保证支持范围内的值[-32767,32767]
,所以当你需要更多时,你应该使用long
. 实际上,很多程序不需要移植到 16 位机器(今天非常罕见),而在大多数现代 64 位平台上,long
将是 64 位,这超出了需要,并且会减慢速度(如果只是因为地势较差)。如果您可以假设int
至少是 32 位,那么您几乎应该在任何地方使用它,但以下情况除外:
如果您关心实际的按位表示,使用按位&
、、|
和^
或~
移位运算符,则默认情况下应使用unsigned
类型unsigned int
,但如果发生以下情况之一,则应使用其他大小。
如果您需要 的模运算unsigned
,请使用无符号类型。这是非常非常罕见的,但确实发生在计算哈希码之类的事情中。
如果您有非常大的表(向量或任何其他连续表示),您可能会考虑short
or 甚至signed char
(或者unsigned short
or unsigned char
,如果您关心按位表示)。除了字符,我不会使用 plain ,因为它的符号是实现定义的。char
如果您需要表示大于 2^31 的值,请考虑long long
. (然而,long long
在这种情况下,通常甚至不够大,你需要某种BigInteger
类。)
作为一般规则,任何事情都int
应该是例外。