我需要移植此汇编指令:
[42] pry(main)> class Parent
[42] pry(main)* @@foo = "Parent"
[42] pry(main)* end
[43] pry(main)> class Thing1 < Parent
[43] pry(main)* @@foo = "Thing1"
[43] pry(main)* end
[44] pry(main)> class Thing2 < Parent
[44] pry(main)* @@foo = "Thing2"
[44] pry(main)* end
[45] pry(main)> Thing1.class_eval("@@foo")
=> "Thing2"
[46] pry(main)> Parent.class_eval("@@foo")
=> "Thing2"
[47] pry(main)> Class.class_eval("@@foo")
=> "Thing2"
所以我做了以下事情:
NEG eax
因为uint32_t a = 0x1234568;
a = reinterpret_cast<uint32_t>(-a);
符合我的要求,这意味着直接解释字节而不需要任何类型的转换/转换。
reinterpret_cast
吗?我问这个问题是因为虽然代码显然在gcc下运行,但它在Visual Studio(reinterpret_cast
和cannot convert from uint32_t to uint32_t
)下无法运行。错误是有道理的,但我不知道如何以不同的方式做到这一点,除了使用比特黑客计算2的补充。
答案 0 :(得分:3)
reinterpret_cast
,static_cast
就足够了。顺便说一句:你的代码真的编译成了&#34; neg&#34;指令,至少在英特尔平台上。 ; - )
更新
C ++语言规范说:
一元运算符的操作数应具有算术或枚举类型,结果是其操作数的否定。对整数或枚举操作数执行整体提升。通过从2 n 中减去其值来计算无符号量的负数,其中 n 是提升的操作数中的位数。结果的类型是提升的操作数的类型。
由于无符号类型被提升为自己,因此一元减号可以应用于无符号类型,并且不会更改它们。
所以写它是正确的,例如:
uint32_t convert( uint32_t x ) {
return -x;
}
可以在那里使用static_cast
,但不需要它。 reinterpret_cast
不能用于转换整数。
答案 1 :(得分:0)
我会使用a = 0 - a;
。或者你可以a = -a;
,但它可能会给出编译警告。警告不是错误,但应该避免。
您也可以尝试内联汇编。
mov eax, a
neg eax
mov a, eax