2014-04-14 55 views
1

是什么 long int numberOfPoints = 131071100;long int numberOfPoints = 131071100L;数据类型`long` C编程

之间的差异,是 int numberOfPoints = 131071100L; 法律这样的任务?如果这与前两者有什么不同?

+0

如果你真的需要“长”(而不是“INT” ),那么你*必须*声明(所有!)你的长变量“长”,你*必须*声明你的整数文字“L”。或者你冒着“悄悄截断”其中一个的风险。 – FoggyDay

+1

如果没有后缀,可能会发生类似[this](http://stackoverflow.com/questions/21295313/cant-assign-2147483648-to-variable-of-type-long-long?rq=1)的情况。 – Dan

+0

,但是有必要将它声明为'long int numberOfPoints = 131071100L;'是否有必要声明带有'long'前缀和附加在数字末尾的'L'的变量?或者是否声明'long int numberOfPoints = 131071100;'或'int numberOfPoints = 131071100L;'完成相同的任务(使其成为'long'变量)? – Justin

回答

1

(这里的一个前面的答案不正确,并且已被修正。)

每ANSI C的规范(类似的语言在C99和C++规范存在):

类型的整数常数的是其中可以表示其值的相应列表 中的第一个。

无后缀十进制:int和long 整型,unsigned long int类型。

后缀八进制或十六进制:整型,无符号 整型,长整型,unsigned long int类型。

用字母u或U加后缀:unsigned int,unsigned long int。

由字母l或L添加后缀:长 整型,unsigned long int类型。

由字母u或U和l或L作为后缀:unsigned long int。

因此,两个表达式之间不会有任何区别,因为C保证常量的类型足够长以保存该值。

3

的类型等131071100一个无后缀整数常数是第一的intlong intlong long int其中其值可以被表示。 131071100的值为总是数学上正确;只有它的类型不同(因为long int至少是32位,所以它总是为intlong int)。

L后缀,它的类型为long intlong long int;再次,价值永远是正确的 - 并且恰巧131071100L总是类型long int

用一个不同数值类型的表达式初始化一些算术类型的对象是完全有效的。该值隐式地转换为为目标类型。在这种情况下,由于目标类型为long int,因此不存在溢出风险。

为您的特定情况下,仅差异

long int numberOfPoints = 131071100; 

long int numberOfPoints = 131071100L; 

的是,后者是稍微明确之间 ;意思是完全一样的。

L后缀仍然需要如果表达式是比单个恒定更加复杂。例如,如果你写:

long int foo = 1024 * 1024 * 1024; 

然后每个恒定1024int型 - 等是整个表达式。如果int正好是刚刚16位,那么乘法会溢出,即使数学结果将适合在long int。 (该类型的文字是根据其价值调整;大量表达的类型不是)为了避免这个问题,你可以写:

long int foo = 1024L * 1024L * 1024L;