【发布时间】:2015-06-12 11:54:39
【问题描述】:
我需要移植这个汇编指令:
NEG eax
所以我做了以下操作:
uint32_t a = 0x1234568;
a = reinterpret_cast<uint32_t>(-a);
因为reinterpret_cast 做了我想做的事,这意味着直接解释字节而不需要任何类型的转换/转换。
- 我需要
reinterpret_cast来实现这个目的吗? 这是否违反严格别名?- 如果我做错了,最好的实施方法是什么?
我问这个问题是因为虽然代码显然可以在 gcc 下运行,但它在 Visual Studio 下不起作用(cannot convert from uint32_t to uint32_t 和 unary minus operator applied to unsigned type, result still unsigned)。这些错误是有道理的,但我不确定如何以不同的方式完成它,除了使用 bit hacks 计算 2 的互补。
【问题讨论】:
-
我希望它计算 2 的补码(与
NEG的方式相同),即获取存储为负整数的相同值的二进制等价物。请注意,它与仅翻转所有位的NOT指令不同。 -
特别想避免手动操作like this.
-
除非我误解了标准,否则
reinterpret_cast是未定义的,不是由于严格的别名违规,而是因为未定义转换本身。在这个草案open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3225.pdf - 5.2.10 - 没有提到从有符号整数类型到无符号整数类型的转换。特别注意“无法使用 reinterpret_cast 显式执行其他转换”。