为啥我不能直接将 __int64 变量设置为 -2500000000?

Posted

技术标签:

【中文标题】为啥我不能直接将 __int64 变量设置为 -2500000000?【英文标题】: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?哎哟!好痛! 【参考方案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。如果它不起作用,请获取更新的编译器。

【讨论】:

以上是关于为啥我不能直接将 __int64 变量设置为 -2500000000?的主要内容,如果未能解决你的问题,请参考以下文章

go_内建变量类型

为啥网页不能正常跳转(在线等-------)

将 int64_t 转换为 NSInteger

int64_t 指针转换为 AVX2 内在 _m256i

关于C语言 的__int64 的:如何输出从键盘读入的__int64 变量 问题

一种将 boost::posix_time::ptime 转换为 __int64 的方法