一位经验丰富的程序员(spoj,codechef,topcoder等)告诉我,一般情况下,我可以使用int来获得高达10 ^ 9的值。
使用的一般规则是什么 签署了long int, unsigned long int, 签署long long int, unsigned long long int
答案 0 :(得分:4)
这个问题的答案取决于平台(因为不同的平台可能有不同的整数大小)。您可以在http://en.cppreference.com/w/cpp/types/numeric_limits
找到相当完整的限制列表答案 1 :(得分:3)
使用int
和long
的主要时间是与使用这些类型的API进行交互时。例如,错误代码和文件描述符的类型为int
,ftell
返回long
。当您知道要处理的数字非常小并且有限时(即无法与完全控制之外的某些部分成比例),您也可以使用int
作为索引/计数器。否则,当您需要能够存储特定已知值时,您应始终使用size_t
来表示内存中对象的大小/索引/计数,以及来自stdint.h
的精确或至少大小类型大小
如果你不能使用stdint.h
(例如,在C89或旧的C ++实现上),你可以使用普通的旧类型:
short
可以存储至少-32767到32767的范围。unsigned short
至少可以存储0到65536的范围。int
可以存储至少-32767到32767的范围(以及符合POSIX标准的系统上的-2147483647到2147483647)。unsigned
可以存储至少0到65536的范围(以及符合POSIX的系统上的0到4294967295)。long
至少可以存储-2147483647到2147483647的范围。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,通常会有一些宏告诉您int
,long 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 short
或unsigned char
,如果你关心按位表示)。我会不使用普通char
来表示除了字符以外的任何内容,因为它的签名是实现定义的。
如果您需要表示大于2 ^ 31的值,请考虑long long
。 (但是,在这种情况下,即使long long
通常也不够大,而且您需要某种BigInteger
类。)
作为一般规则,除int
之外的任何内容都应该是例外。