整数字面量末尾的"L"代表什么?

33

我有这个常量:

#define MAX_DATE  2958465L

在这种情况下,L代表什么意思?


2
这不是一个常量,而是一个宏(它会扩展为字面值)。 - H H
那么这个数字会扩展到什么? - Tony The Lion
4个回答

47

这是一个long整数字面量。

整数字面量默认类型为int;添加后缀L可以将其类型更改为long(注意,如果值无法用int表示,则即使没有后缀,字面量的类型也将为long)。


确定吗?据我所知,在C++中,没有'L'后缀的字面量属于整数类型,如果字面量无法适应int类型,则编译将失败。 - David Rodríguez - dribeas
10
如果一个数是十进制且没有后缀,它将使用可以表示其值的第一种类型:intlong int(参考 C++03 §2.13.1/2)。 - James McNellis
所以看起来编译器可以自动为我们选择。那么什么时候我们想要自己加上“L”后缀呢? - kizzx2
7
42是一个整数(int)。如果您想让它成为一个长整数(long),需要添加L(得到42L)。明确使用long有许多原因:您可能会使用它来选择特定函数重载,或确保模板使用long而不是int进行实例化。您可能会使用它来确保某些整数表达式使用long精度而不是int精度进行评估。INT_MAX+1将发生溢出。如果long的范围比int大,则INT_MAX+1L不会发生溢出。 - James McNellis

9
在这种情况下,L没有作用。
在一个数字后面加上L会将常量转换为long类型,但由于在此情况下该常量立即被赋值给一个int变量,因此不会发生任何更改。

4
你能否举个例子来说明它确实起了作用? - Celeritas
@Celeritas 这很有用:https://dev59.com/hmcs5IYBdhLWcg3wGgJc - Hari

4

L 告诉编译器这个数是 Long 类型的。Long 是一种有符号类型,大小大于或等于 int。在大多数现代编译器上,这意味着该数字将占用 4 个字节的内存。这恰好与大多数编译器上的 int 相同,因此在这种情况下不会产生影响。


1
长整型是有符号的,在Mac OS上使用gcc编译器,长整型长度为8个字节。 - Adrien

1

看一下this链接,它说:

字面常量(通常称为字面值或常量)是不变的,其值由它们的表示隐含。

基数:十进制

示例:1L

描述: 任何十进制数字(0-9)不以0(零)开头并后跟L或l的数字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接