【发布时间】:2013-05-04 12:18:50
【问题描述】:
这是关于一些非常基本的事情。
在定义 long long 类型时,表达式就像。
long long x=5435666LL;
我不明白为什么 LL 是后修复的,因为即使没有后修复,编译器也很清楚地分配正确的内存空间(在 vc++ 中为 8 个字节),无论如何它在没有后修复的情况下都会这样做。
那么“LL”后修复有什么用途?
【问题讨论】:
标签: c++
这是关于一些非常基本的事情。
在定义 long long 类型时,表达式就像。
long long x=5435666LL;
我不明白为什么 LL 是后修复的,因为即使没有后修复,编译器也很清楚地分配正确的内存空间(在 vc++ 中为 8 个字节),无论如何它在没有后修复的情况下都会这样做。
那么“LL”后修复有什么用途?
【问题讨论】:
标签: c++
你的代码相当于
long long x;
x = 5435666LL
没有LL 后缀,5435666 是int。无论哪种情况,结果都是相同的,因为 5435666 适合 int,除非您使用的是 16 位平台。
【讨论】:
void foo(long) 和void foo(int),则foo(1L) 选择long 过载,foo(1) 选择int 过载。使用L 前缀,您可以强制long 过载,而无需知道您的号码是否适合int。
如果没有后缀,编译器将选择int、long int 和long long int 中的第一个值适合的值。但是,您可能特别想要一个适合int 的值是long long int 类型。为此,您将使用 LL 后缀。
人为的例子:
template <typename T>
void foo(T x) {
static_assert(std::is_same<T, long long>::value, "Must be long long!");
}
int main()
{
foo(0); // Error because 0 without a suffix is an int
foo(0LL);
}
为了证明这些文字具有不同的大小(假设 int 和 long long int 在您的实现中具有不同的大小),请考虑 the following example:
#include <iostream>
int main()
{
std::cout << sizeof(0) << ' ' << sizeof(0LL) << std::endl;
}
对我来说,这个输出:
4 8
【讨论】:
int,如果它适合int,并且会使用int 占用的字节数。使用后缀,它将始终占用long long 所需的字节数。
x 定义为long long。 x 本身当然具有long long 的大小。 integer literal 将具有不同的大小。
在您的示例中,它仅具有装饰性目的。
我可以想到以下示例,它可能会有所不同,因为文字被假定为int:
enum {
Flag1 = 1 << 0,
Flag2 = 1 << 33,
Flag3 = 1LL << 33;
}
【讨论】: