【问题标题】:'long long int' is interpreted as 'long int'. How do I get round this?“long long int”被解释为“long int”。我该如何解决这个问题?
【发布时间】:2010-03-10 15:38:34
【问题描述】:

我正在为我在大学的数学课程从事涉及 c 编程的项目。 我需要能够处理大整数,大于可以存储在“long int”数据类型中的整数。所以我尝试使用'long long int',但如果我尝试这样的事情:

long long int number;
number = 10000000000;

然后错误信息说'error: integer constant too large for "long" type'.

我尝试过其他数据类型,例如 '___int64' 和 'int_64t' 我尝试过包含所有标准 c 库,但仍然遇到同样的问题。

奇怪的是,当我尝试'printf("LLONG_MAX = %lld\n", LLONG_MAX);' 时,我得到了这个:

LLONG_MAX = -1

我在 windows xp 上使用 Codeblocks 8.02,但我不确定安装了哪个版本的 gcc 编译器,因为我在校园内使用网络计算机并且我没有访问主文件系统的权限。我不想每天都带着我的笔记本电脑进入校园。请帮忙!谢谢

【问题讨论】:

    标签: c++ c integer


    【解决方案1】:

    当编译器编译您的 C 文件并遇到整数或浮点常量时,它需要为其分配一个类型。它将为您隐式选择默认类型。您可以通过为编译器提供整数后缀来显式设置类型。整数后缀可以告诉编译器它是否很长, long long 或无符号类型。

    • 10 是一个隐含的有符号整数
    • 10u, 10U 是明确的无符号整数
    • 10l, 10L 是明确的有符号长整数
    • win32 上的 10ll、10LL 或 10i64 明确是有符号长整型
    • 10ull 明确是一个 unsigned long long

    浮点类型也有这种情况。类型可以是浮点数、双精度 或长双。浮点类型通常默认为 double。

    • 10.0 是隐含的双精度数
    • 10.0f 或 10.0F 明确是一个浮点数
    • 10.0l 或 10.0L 明确地是一个 long double

    【讨论】:

      【解决方案2】:

      在整数常量末尾添加ll

      【讨论】:

      • 我试过了。不起作用 number = 10000000000ll printf("number = %lld, number); 给我 'number = 141006540​​8'
      • 也许你可以指定“ll”是小写的“LL”,我不确定你写的和十一(11)之间的区别Edit如果你知道gcc的安装位置,你可以输入“gcc -v”来获取版本。
      • 是的,很抱歉造成混乱。我不确定如何获取 gcc 的版本,我使用的是 windows xp 而不是 linux,因此命令提示符下无法识别命令“gcc”。
      【解决方案3】:

      在 Microsoft 环境中使用以下语法的 printf :

      __int64 i64 = 10000000000; 无符号 __int64 u64 = 10000000000000000000; printf ("%I64d\n", i64 ); printf ("%I64u\n", u64 ); printf ("%I64d\n", u64 );

      【讨论】:

        【解决方案4】:

        嗯,Code::Blocks 使用 GCC 作为其常用的编译器。最新版本明确支持 64 位类型。

        所以你应该可以

        #include <inttypes.h>
        uint64_t unsigned64BitNumber;
        int64_t signed64BitNumber;
        

        【讨论】:

          【解决方案5】:

          您应该能够将 long long int 与 gcc 编译器一起使用,但我认为它可能需要使用 c99 std 代码,而您的默认值可能是 c89 模式。尝试将 --std=c99 添加到您的编译器命令行中,看看是否有帮助:-)

          【讨论】:

          • 那是除了 pavpanchekha 的回应
          • 对不起,我是个新手,我没有使用命令行,我只是在代码块中单击“构建并运行”。我该怎么做?
          • 没问题。自从我使用代码块以来已经有一段时间了,但我认为转到“设置”然后“编译器和调试器”会打开相关窗口。从那里您需要“编译器设置/编译器标志选项卡”并查找并选择使用 C99 模式或 ISO C90 用于 c 程序。我不确定确切的选项名称。中途 codeblocks.org/docs/main_codeblocks_en3.html 描述编译器选项窗口
          • 实际上,请确保您使用 C99 我不确定即使 c90 包含长期支持
          • 我试过选中“在 C 模式下,支持所有 ISO C90 程序”框。这不起作用,现在它说“LLONG_MAX 未在此范围内声明”
          【解决方案6】:

          也许编译器对数据类型的 int 部分感到困惑 - 您是否尝试过使用 long long 代替?

          This website 可能会帮助你。

          【讨论】:

          • 我试过了。我也看过这个网站,这让我尝试了'printf("LLONG_MAX = %lld" LLONG_MAX);'。它给了我 LLONG_MAX = -1 这很奇怪:(
          【解决方案7】:

          除了前面关于后缀和 gcc C99 模式的 cmets 之外,如果你不能让 long long 工作,并且你只需要不超过 2^52 的整数,你可以使用 double。假设 IEEE 双精度格式(0 +1 偏置指数),最大 2^52 的整数应该可以精确表示为 double。

          【讨论】:

            【解决方案8】:

            正如人们已经发布的那样,您应该检查您正在使用的编译器。 在 Code:Blocks 你做的(无论如何,在我的版本中,希望它也对你有用):

            首先通过选择找出为您的项目选择的编译器 项目->构建选项...并查看“选定编译器”中的内容

            然后选择: Settings->Compiler and debugger... 并选择您刚刚找到的编译器。 然后单击“工具链可执行文件”并查看它的含义,例如“C 编译器”。

            也许如果你成功了,并发布你的结果,这里有人可以帮助你。

            【讨论】:

              猜你喜欢
              • 2012-01-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-07-29
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多