2

我正在尝试检查是否在无符号整数中设置了位。我不确定我怎么能做到这一点,但我认为它会是这样的。我正在尝试用 C++ 制作 cdq 指令(但是一个函数)

这是我所拥有的

unsigned int cdq(unsigned int eax)
{
     unsigned int edx = 0;

     if( (eax >> 31) & 1 ) { edx = 0xFFFFFFFF; }
     return edx
}

当我使用具有以下值的函数时:

cdq(0x12345678) 第 31 位已设置 (1),因此应返回 (unsigned int)-1 cdq(0x01) 第 31 位未设置 (0),因此应返回 0

问题是它总是返回 0,我不知道为什么

4

1 回答 1

6

cdq(0x12345678) 位 31 已设置 (1)

不,不是……最高位设置为第 28 位:

    1    2    3    4    5    6    7    8
 0001 0010 0011 0100 0101 0110 0111 1000
 ^  ^ 
 |  |
31  28

你的代码应该可以工作,但我会使用

if( eax & (1U << 31) ) edx = 0xFFFFFFFF;

因为它更直接一些,并且它移动一个常量而不是一个变量,所以在运行时做的工作更少(尽管优化编译器应该为两者生成相同的代码)。

其实我会写类似

int cdq(int eax)
{
    return eax < 0? -1 : 0;
}

顺便说一句,您的代码实际上并没有实现 cdq 因为您的 eax 和 edx 变量不是硬件 eax 和 edx 寄存器。无论如何,将 ASM 指令复制为 C 函数确实不是一个好主意...... C 有自己的特性来做这些事情,例如,

int32_t foo = -0x12345678;
int64_t bar = (int64_t)foo;
于 2013-05-21T06:39:25.130 回答