【问题标题】:Why can't I directly set an __int64 variable to -2500000000?为什么我不能直接将 __int64 变量设置为 -2500000000?
【发布时间】:2011-02-18 20:53:33
【问题描述】:

这个程序是在 WindowsXP 机器上用 VC++ 6.0 编写的。

如果我尝试将 __int64 变量直接设置为 -2500000000,它会被截断为 32 位值并取二进制补码。

__int64 testval;
testval = -2500000000;

此时 testval 等于 1794967293(110 1010 1111 1101 0000 0111 0000 0000 二进制)。

当我将变量设置为 2500000000 然后乘以负一时,它起作用了:

__int64 testval;
testval = 2500000000;
testval *= -1;

变量 testval 等于 -2500000000(1001 0101 0000 0010 1111 1001 0000 0000 二进制)。

有什么想法吗? 谢谢。

【问题讨论】:

  • MSVC6?哎哟!好痛!

标签: c++ windows visual-c++ visual-c++-6 int64


【解决方案1】:

获取更新的编译器。 VC6 标准合规性非常差。

在 VC6 中,尝试使用 i64 的后缀,如

__int64 toobig = -2500000000i64;

找到the documentation

【讨论】:

  • 谢谢,这将是首选方法,但目前不是一个选项。
  • @E:我想我有 VC6 的解决方案,但我不再安装可以测试它的副本。
  • 那行得通。谢谢!这需要在他们的 __int64 文档中链接。
  • @E:我同意,但我认为微软不再修复 VC6 文档了。他们仍然关心它是否在新版本的 Windows 上安装和运行是一个奇迹。而且好像是在旧的 MSDN 网站上,不支持社区贡献的内容,所以我不能自己添加。
【解决方案2】:

编译器将常量 2​​500000000 视为 32 位数字。您需要通过在常量末尾附加LL 来明确告诉它将其视为long int。所以,试试吧:

testval = -2500000000LL;

更新:由于您的编译器不支持此功能,并且您被 VC6 卡住,请尝试将其分解为两个 32 位数字乘积的值,如下所示:

testval = -250000;
testval *= 10000;

【讨论】:

  • 使用LL 可能比L 更安全
  • 那个(使用 32 位类型的编译器)违反了 C++0x 部分 [lex.icon]... 任何人都有 C++03 或 C++ 的措辞98?
  • C++03 可能不会有太大帮助,考虑到 90 年代后期发布的 Visual C++ 6。
  • 我认为拆分一千个而不是无数个更可取,而且计数(掌握)三个而不是四个零要容易得多。
【解决方案3】:

正确的语法是 -2500000000LL。如果它不起作用,请获取更新的编译器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 2014-08-01
    • 2012-08-20
    • 2012-11-18
    相关资源
    最近更新 更多