【问题标题】:bcc32c Error integer literal is too large to be represented in any integer typebcc32c 错误整数文字太大而无法以任何整数类型表示
【发布时间】:2022-01-10 14:31:21
【问题描述】:

我有一个很大的 __int64 字面量:

const __int64 PwTab[] = {
                        50036500600837093008i64,
                        3006206760097890820056i64
                        };

bcc32(Borland 经典编译器)很好地接受了它,但bcc32c(clang)却没有。

clang编译器的错误是:

整数字面量太大,无法用任何整数类型表示

我使用i64 后缀告诉计算机它是一个 64 位整数文字。

如何在clang中写出__int64字面量,同时兼容经典编译器中的__int64类型?

【问题讨论】:

  • 不要使用 __int64i64 前缀。这些是已弃用的 Microsoft 特定功能。改用long long(或更好的ìnt64_t)类型和ll 后缀。
  • 另外,50'036'500'600'837'093'008 需要至少 66 位来表示(如果有符号则为 67 位)。您希望 64 位整数保持什么值?
  • @Brian 你是对的,我没有注意到,但它在 bcc32 中编译......可能会发生一些截断或溢出而没有被编译器报告......我会有更详细地检查这一点...感谢您的 cmets!

标签: c++ c++builder clang++ literals


【解决方案1】:

正如 cmets 中提到的,问题在于 bcc32 在编译期间没有报告太大的文字,而是默默地溢出,这当然会在运行时创建与预期完全不同的数组。

例如

int64_t testVar = 0x112233445566778899aai64;

这当然大于 64 位整数可以接受的值,并导致运行时值:

0x33445566778899aa

旁注 - ll 后缀在 Borland 经典编译器中不起作用。所以我必须在其中使用i64。但是切换到clang之后就没有问题了。

【讨论】:

    猜你喜欢
    • 2016-05-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2017-09-12
    • 1970-01-01
    • 2011-04-15
    • 2018-03-04
    • 2015-01-26
    相关资源
    最近更新 更多