有一些明显的东西,我觉得我应该在这里理解,但我不知道:
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;
}
为什么添加操作会影响高4字节,以及如何影响?
(编译器是VC ++ 2003)
答案 0 :(得分:4)
可能是因为second
已签名,这意味着0x92009019为负。
编辑:问题实际上包含两个问题。
1)如何将两个32位数加入64位值?
答案:
(((uint64_t)first) << 32) | (uint32_t)second
2)使用浮点类型double
进行位操作是否明智?
答案:不,不是。请使用正确的工具进行工作。如果要进行位操作,请使用整数。如果您想要(几乎)连续值,请使用浮点值。
答案 1 :(得分:3)
long有53位精度。我很惊讶你得到了最后的数字。 (第一个错误的数字由Lindydancer解释)。
编辑:我不再感到惊讶:因为结果是否定的,你的数据不需要38位精度。如果你使用
first = 0xffdfffc1;
你正在用双重解决方案失去lsb。