有什么区别
long int numberOfPoints = 131071100;
和
long int numberOfPoints = 131071100L;
并且是如此的作业
int numberOfPoints = 131071100L;
法律?如果它与前两个有什么区别呢?
答案 0 :(得分:3)
131071100
之类的非整数常量类型是int
,long int
和long long int
中的第一个,其值可以表示。 131071100
的值始终在数学上是正确的;只有它的类型不同(因为long int
至少是32位,所以它始终是int
或long int
。
使用L
后缀,其类型为long int
或long long int
;再次,值始终是正确的 - 并且131071100L
始终是long int
类型。
使用不同数值类型的表达式初始化某种算术类型的对象是完全有效的。该值隐式转换到目标类型。在这种情况下,由于目标类型为long int
,因此不存在溢出的风险。
对于您的特定情况,仅
之间的差异long int numberOfPoints = 131071100;
和
long int numberOfPoints = 131071100L;
是后者稍微更明确;意思完全一样。
如果表达式比单个常量更复杂,则仍然需要L
后缀。例如,如果你写:
long int foo = 1024 * 1024 * 1024;
然后每个常量1024
的类型为int
- 整个表达式也是如此。如果int
碰巧只是16位,则乘法将溢出,即使数学结果适合long int
。 (文字的类型根据其值进行调整;大表达式的类型不是。)为了避免这个问题,你可以写:
long int foo = 1024L * 1024L * 1024L;
答案 1 :(得分:1)
(此前的答案不正确并已修改。)
根据ANSI C规范(C99和C ++规范中存在类似语言):
整数常量的类型是相应列表的第一个 其值可以表示。
无符号十进制:int,long int,unsigned long int。
Unsuffixed octal或hexadecimal:int,unsigned int,long int,unsigned long int。
后缀为字母u或U:unsigned int,unsigned long int。
后缀为字母l或L:long int,unsigned long int。
后缀为字母u或U和l或L:unsigned long int。
因此,两个表达式之间没有任何区别,因为C保证常量的类型足够长以保存该值。