类型安全和 NEG 指令
Type safety and NEG instruction
我需要移植这个汇编指令:
NEG eax
所以我做了以下操作:
uint32_t a = 0x1234568;
a = reinterpret_cast<uint32_t>(-a);
因为 reinterpret_cast
做我想做的,这意味着直接解释字节而不需要任何类型的 casting/conversions。
- 我需要
reinterpret_cast
吗?
这是否违反了严格的别名?
- 如果我做错了,最好的实现方式是什么?
我问这个问题是因为虽然代码显然在 gcc 下工作,但它在 Visual Studio(cannot convert from uint32_t to uint32_t
和 unary minus operator applied to unsigned type, result still unsigned
)下不起作用。这些错误是有道理的,但我不确定除了使用 bit hack 计算 2 的补码之外,我该如何以不同的方式来做到这一点。
- 这里不需要
reinterpret_cast
,static_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
我需要移植这个汇编指令:
NEG eax
所以我做了以下操作:
uint32_t a = 0x1234568;
a = reinterpret_cast<uint32_t>(-a);
因为 reinterpret_cast
做我想做的,这意味着直接解释字节而不需要任何类型的 casting/conversions。
- 我需要
reinterpret_cast
吗? 这是否违反了严格的别名?- 如果我做错了,最好的实现方式是什么?
我问这个问题是因为虽然代码显然在 gcc 下工作,但它在 Visual Studio(cannot convert from uint32_t to uint32_t
和 unary minus operator applied to unsigned type, result still unsigned
)下不起作用。这些错误是有道理的,但我不确定除了使用 bit hack 计算 2 的补码之外,我该如何以不同的方式来做到这一点。
- 这里不需要
reinterpret_cast
,static_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