为啥我不能直接将 __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】:编译器将常量 2500000000 视为 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?的主要内容,如果未能解决你的问题,请参考以下文章