我正在尝试检查并查看是否在unsigned int中设置了一个位.我不知道我怎么做到这一点,但我认为它会是这样的.我正在尝试用C++编写cdq指令(但是一个函数)
这就是我所拥有的
unsigned int cdq(unsigned int eax)
{
unsigned int edx = 0;
if( (eax >> 31) & 1 ) { edx = 0xFFFFFFFF; }
return edx
}
Run Code Online (Sandbox Code Playgroud)
当我使用具有以下值的函数时:
cdq(0x12345678)第31位设置为(1)所以它应该返回(unsigned int)-1 cdq(0x01)bit 31没有设置(0)所以它应该返回0
问题是它总是返回0,我不知道为什么
cdq(0x12345678)位31设置(1)
不,它不是......最高位设置是第28位:
1 2 3 4 5 6 7 8
0001 0010 0011 0100 0101 0110 0111 1000
^ ^
| |
31 28
Run Code Online (Sandbox Code Playgroud)
您的代码应该可以工作,但我会使用
if( eax & (1U << 31) ) edx = 0xFFFFFFFF;
Run Code Online (Sandbox Code Playgroud)
因为它更直接,它移动一个常量而不是一个变量,所以在运行时更少工作(尽管优化编译器应该为两者生成相同的代码).
其实我会写类似的东西
int cdq(int eax)
{
return eax < 0? -1 : 0;
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您的代码实际上并没有实现cdq,因为您的eax和edx变量不是硬件eax和edx寄存器.而且,将ASM指令复制为C函数实际上并不是一个好主意... C有自己的功能来做这些事情,例如,
int32_t foo = -0x12345678;
int64_t bar = (int64_t)foo;
Run Code Online (Sandbox Code Playgroud)