【问题标题】:Postfix LL for type long long用于 long long 类型的后缀 LL
【发布时间】:2013-05-04 12:18:50
【问题描述】:

这是关于一些非常基本的事情。

在定义 long long 类型时,表达式就像。

long long x=5435666LL;

我不明白为什么 LL 是后修复的,因为即使没有后修复,编译器也很清楚地分配正确的内存空间(在 vc++ 中为 8 个字节),无论如何它在没有后修复的情况下都会这样做。

那么“LL”后修复有什么用途?

【问题讨论】:

    标签: c++


    【解决方案1】:

    你的代码相当于

    long long x;
    x = 5435666LL
    

    没有LL 后缀,5435666int。无论哪种情况,结果都是相同的,因为 5435666 适合 int,除非您使用的是 16 位平台。

    【讨论】:

    • 所以请帮助我。即使有或没有 LL 编译器都分配了 8 个字节(long long 类型的内存空间)而不是 4 个字节(int 类型的内存空间)那么再次使用后缀有什么意义?
    • 也许是习惯或一致性,以便在重要的时候也这样做。
    • @user1619447:调用重载函数时可能很重要。例如,如果有void foo(long)void foo(int),则foo(1L) 选择long 过载,foo(1) 选择int 过载。使用L 前缀,您可以强制long 过载,而无需知道您的号码是否适合int
    【解决方案2】:

    如果没有后缀,编译器将选择intlong intlong 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);
    }
    

    为了证明这些文字具有不同的大小(假设 intlong long int 在您的实现中具有不同的大小),请考虑 the following example

    #include <iostream>
    
    int main()
    {
        std::cout << sizeof(0) << ' ' << sizeof(0LL) << std::endl;
    }
    

    对我来说,这个输出:

    4 8
    

    【讨论】:

    • 所以请帮助我。即使有或没有 LL 编译器都分配了 8 个字节(long long 类型的内存空间)而不是 4 个字节(int 类型的内存空间)那么再次使用后缀有什么意义?
    • @user1619447 不,如果没有后缀,它就是int,如果它适合int,并且会使用int 占用的字节数。使用后缀,它将始终占用long long 所需的字节数。
    • 有一次我做了这个 long long x= 5435666LL; cout
    • @user1619447 您已将x 定义为long longx 本身当然具有long long 的大小。 integer literal 将具有不同的大小。
    【解决方案3】:

    在您的示例中,它仅具有装饰性目的。

    我可以想到以下示例,它可能会有所不同,因为文字被假定为int

    enum {
        Flag1 = 1 << 0,
        Flag2 = 1 << 33,
        Flag3 = 1LL << 33;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多