算术与双vs位操作
arithmetic with double vs bit operations
这里有一些明显的东西我觉得我应该理解,但我不:
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
相关文章:
- 对字符串进行位操作
- 对字符数组中的元素执行逐位操作
- 逐位操作的隐式类型转换
- 如何进行特定的位操作?
- C++避免位操作完全移位
- 使用双包装器类进行位操作(C++、clang)修复性能下降问题
- 使用位操作优化检查
- 子集相关位操作
- 使用 c++ 提升库的按位操作
- 位操作和异或
- 位操作将最左侧的设置位转换为右侧交替位?
- 为什么对小于 4 个字节的整数类型的位操作会发生意外行为?
- POD 类型的原子按位操作
- 如何使用位操作在单个整数中编码和解码两个数字
- __int128的位操作
- 使用位操作会影响内存消耗?
- 在具有位操作的函数中获得值
- C/C 位操作不会导致预期输出
- 为什么以下两个程序产生不同的输出?(C++,位操作,VS 2012)
- 算术与双vs位操作