类型安全和 NEG 指令

Type safety and NEG instruction

我需要移植这个汇编指令:

NEG eax

所以我做了以下操作:

uint32_t a = 0x1234568;
a = reinterpret_cast<uint32_t>(-a);

因为 reinterpret_cast 做我想做的,这意味着直接解释字节而不需要任何类型的 casting/conversions。

我问这个问题是因为虽然代码显然在 gcc 下工作,但它在 Visual Studio(cannot convert from uint32_t to uint32_tunary minus operator applied to unsigned type, result still unsigned)下不起作用。这些错误是有道理的,但我不确定除了使用 bit hack 计算 2 的补码之外,我该如何以不同的方式来做到这一点。

  • 这里不需要reinterpret_caststatic_cast就够了。
  • 您的代码不适用于指针,因此不存在别名问题。
  • 结论:这种做法没有错。

顺便说一句:您的代码确实编译为 "neg" 指令,至少在 Intel 平台上是这样。 ;-)


更新:

C++ 语言规范说:

The operand of the unary − operator shall have arithmetic or enumeration type and the result is the negation of its operand. Integral promotion is performed on integral or enumeration operands. The negative of an unsigned quantity is computed by subtracting its value from 2n, where n is the number of bits in the promoted operand. The type of the result is the type of the promoted operand.

并且由于无符号类型被提升为自身,一元减号可以应用于无符号类型并且不会更改它们。

所以这样写是正确的,例如:

uint32_t convert( uint32_t x ) {
    return -x;
}

static_cast 可以在那里使用,但不是必需的。 reinterpret_cast不能用来转换整数。

我会使用 a = 0 - a;。或者你可以有 a = -a; 但是它可能会给出编译警告。警告不是错误,但是应该避免。

你也可以尝试内联汇编。

mov eax, a
neg eax
mov a, eax