L
后缀用于表示数字文字的类型long int
。通常,如果您只是将值分配给变量,则没有必要,因为对于 C++11 §2.14.2 ¶2(特别是表 6),没有后缀的十进制整数文字将是第一种类型可以在或int
之间表示它。1long int
long long int
因此,您不会冒险将值本身截断;但:
- 您确实对文字的类型有一定程度的不确定性(
32768
可能是 anint
或 a long
,取决于平台/编译器);
- 您可能会无意中为您的特定表达式获得错误类型的文字。
因此,您需要L
在要确保文字类型为long
(或更大)的上下文中指定;想到两个重要的案例:
解决重载;如果你有一个函数的两个重载,一个 forint
和一个 for ,并且即使你传递一个小数字,你也long
想确保调用一个,你将不得不使用文字;long
long
void foo(int);
void foo(long);
foo(1); // <-- will call the first overload
foo(1L); // <-- will call the second overload
foo(32768); // <-- may call the first or the second overload, depending
// from the specific platform
foo(32768L); // <-- will call the second overload
但最重要的是:在做算术时避免意外;如果你执行例如这样的乘法:
int a;
...
long v=32767*a; // don't let the "long" fool you - 32767*a is evaluated as an int!
32767
是int
文字(因为它小到可以容纳 a int
),a
是 a int
,结果将是 a int
,即使您分配给 a long
。a
如果大到足以溢出您的计算,这可能是一个问题;通过指定long
文字,您保证您将执行long
乘法。
long v=32767L*a; // now we are doing all the math with longs
(这个问题实际上在除法和 FP 文字中double
更为常见,通常您必须指定float
文字才能获得预期的“真正除法”行为)
正如@chris建议的那样,在进行“大”位移时会出现一种更常见的情况(同类),例如:
long long mask=1<<53;
出现与上述相同的问题:1
is an int
, 53
is an int
,计算将使用int
s 执行,导致溢出(尽管在这种特殊情况下,任何体面的编译器都会发出警告);这里正确的形式是:
long long mask=1LL<<53; // LL is the suffix for long long
来到你的特定代码:拿走没有风险L
;因为number
已经是 a long
,在进行模运算时无论如何2
都会被提升为long
(根据“通常的算术转换”、§5 ¶10 和 §4.5),所以这里L
没有区别。
尽管如此,在许多情况下,保留“预期类型”的字面量并不是一个坏主意:它保证即使另一个操作数的类型由于某种原因更改为更窄的类型,计算仍将在预期的方式(不是模数会产生任何影响)。
整数文字的类型是表 6 中可以表示其值的相应列表中的第一个。