【问题标题】:Returning a long long value返回一个 long long 值
【发布时间】:2011-01-24 22:25:34
【问题描述】:
#include <stdio.h>

int main(void) 
{
    long long x = test();
    printf("%lld\n", x);

    return 1;
}

long long test()
{   
    return 1111111111111111111;
} 

输出为 734294471 。如果我用数字替换对test() 的调用,则输出与我预期的一样。我使用调试器检查了 x 的值,它没有设置为函数返回的值。出了什么问题?

我正在使用带有 Visual C++ 编译器的 Visual Studio 2010。

【问题讨论】:

  • 您的 IDE 与此类问题无关,&lt;stdio.h&gt; 不是 C++ 标头 - 如果出于某种原因您需要在 C++ 代码中使用 C 风格的 IO 库,#include &lt;cstdio&gt;而是。
  • @Karl 我提到了 IDE,因为它可能会影响编译器设置。
  • 很好的问题,它简要而清晰地指出了我遇到的问题。我很惊讶它没有得到更多的支持。

标签: c++ c visual-c++ long-long


【解决方案1】:

你需要在调用它之前声明test,否则C假定它返回int

【讨论】:

  • 即使在如今的 C 语言中,这种行为是否也已被弃用?实际上,我本来预计会出现编译错误。至少在 C++ 中——使用之前没有看到声明的函数——是非法的。
  • 这解决了!启用所有编译器警告会显示警告。
  • @tobyodavies:在 C89 中是允许的,这是 Microsoft 编译器支持的最新 C 标准。据推测,OP 正在将此代码编译为 C,而不是 C++。
  • @Pulkit,您在 阅读编译器发出的警告之前在 SO 上发帖...认真吗?
  • @tobydavies 我没有经常使用 VC++ 编译器,也不知道默认情况下会禁用某些警告。原始编译没有显示任何警告。
【解决方案2】:

IIRC,C/C++ 中的 long long 常量以 'LL' 为后缀。

long long test() {
    return 1111111111111111111LL;
}

您的编译器将您的常量视为 32 位长(如果您将常量取模 2^32,则得到 734294471。)

【讨论】:

  • 我以为一个 L 把它变成了 long,第二个把它变成了 long long
  • 无后缀十进制常量的类型是intlong intlong long int中可以表示数字的第一个。 LL 后缀只需要强制一个 较小的 数字,否则该数字将是 intlong 类型,而不是 long long
  • 后缀不是必需的,因为如果常量不适合 int,它将具有 longlong long 类型,具体取决于其值 stackoverflow.com/q/8108642/995714
【解决方案3】:

尝试将 LL 添加到您的返回值:

long long test()
{   
    return 1111111111111111111LL;
} 

【讨论】:

    【解决方案4】:

    将后缀 LL 添加到您的文字中,看看会发生什么。据推测,编译器将文字转换为 int。您是否从编译器收到任何警告?

    【讨论】:

    • 别自以为是,知道。对于没有后缀的十进制整数常量,编译器会从intlonglong long 中挑选出足够长来表示数字的第一个。
    猜你喜欢
    • 2023-03-29
    • 2014-08-10
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    相关资源
    最近更新 更多