gpt4 book ai didi

c++ - 编译器或 cpu 中的 64 位溢出错误

转载 作者:太空宇宙 更新时间:2023-11-04 15:42:41 25 4
gpt4 key购买 nike

这是编译器或 CPU 中的错误,还是不是错误(我在 Windows 上使用 Visual Studio 2010)?

我有这个测试程序:

    {
puts("===========================");
puts("Long Long");

long long maxInt = 0x7fffffffffffffff;

if (maxInt * 1.0 + 0.5 > 0x7fffffffffffffff)
puts("Greater");
else
puts("Not Greater");

long long newVal = maxInt * 1.0 + 0.5;

if (newVal == 0x8000000000000000)
puts("It is 0x8000000000000000");
else
puts("is NOT 0x8000000000000000");
}

{
puts("===========================");
puts("int");

int maxInt = 0x7fffffff;

if (maxInt * 1.0 + 0.5 > 0x7fffffff)
puts("Greater");
else
puts("Not Greater");

int newVal = maxInt * 1.0 + 0.5;

if (newVal == 0x80000000)
puts("It is 0x80000000");
else
puts("is NOT 0x80000000");
}

当我运行它时,我看到了这个输出:

===========================

Long Long

Not Greater

It is 0x8000000000000000

===========================

int

Greater

is NOT 0x80000000

我假设“大于”比较转换为 float ,或者可能是 double .但是当第一个比较说“不更大”时,我希望转换为“long long”,将得到 0x7fffffffffffffff值而不是溢出到 0x8000000000000000 .

带有 int一切如我所愿。

那么为什么 64 位行为不是我所期望的?

最佳答案

double 仅包含 53 位尾数,而 long long 包含 64 位。您将在转换中丢失最低位。事实上,它们是四舍五入的,这就是为什么你最终得到 0x800000000 的原因。

关于c++ - 编译器或 cpu 中的 64 位溢出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20890920/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com