算术与双vs位操作

arithmetic with double vs bit operations

本文关键字:vs 位操作      更新时间:2023-10-16

这里有一些明显的东西我觉得我应该理解,但我不:

void main()
{
    long first = 0xffffffc1;
    long second = 0x92009019;
    //correct
    __int64 correct = (((__int64)first << 32) | 0x00000000ffffffff) & (0xffffffff00000000 | second); //output is 0xffffffc192009019;
    //incorrect
    __int64 wrong = (double)(((__int64)first << 32) + second); //output is 0xffffffc092009019;
}

为什么add操作会影响上面的4个字节,如何影响?

(编译器为vc++ 2003)

可能是因为second是有符号的,这意味着0x92009019是负的。

编辑:这个问题实际上包含两个问题。

1)如何将两个32位的数字连接到一个64位的值?

答:

(((uint64_t)first) << 32) | (uint32_t)second

2)使用浮点类型double进行位操作是否明智?

答案:不,它不是。请使用正确的工具。如果你想做位运算,请使用整数。如果你想要(几乎)连续的值,使用浮点值

长度为53位。我很惊讶你把最后的数字记对了。(第一个错误数字由Lindydancer解释)。

编辑:我不再感到惊讶:因为结果是负面的,你不需要只使用38位的数据精度。如果使用

first = 0xffdfffc1;

你正在失去双解的LSB