C++ C/C++;检查位31是否设置为无符号整数

C++ C/C++;检查位31是否设置为无符号整数,c++,c,bits,C++,C,Bits,我试着检查一个无符号整数中是否设置了一个位。我不确定怎么做,但我想应该是这样的。我试图在C++(但是一个函数)中实现CDQ指令 这是我的 unsigned int cdq(unsigned int eax) { unsigned int edx = 0; if( (eax >> 31) & 1 ) { edx = 0xFFFFFFFF; } return edx } 当我使用具有以下值的函数时: cdq(0x12345678)位31被设置为(

我试着检查一个无符号整数中是否设置了一个位。我不确定怎么做,但我想应该是这样的。我试图在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,我不知道为什么

设置了干熄焦(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;

如何在0x12345678中设置位31?最高位集为第28位。@juanchopanza“您需要
eax>>30
”--错误。
eax&0x7fffff
如果“最后”位为0,则为0,!=否则为0。假设无符号int至少有32位。然后请注意,在0x12345678中,未设置第31位。@JimBalter我不知何故读取了“第31位”,而不是“第31位”。我的错。@JimBalter你是对的,这真的很可怕。我希望我能活得足够长,以弥补这一不可原谅的行为。同时,我删除了冒犯性的评论,希望这一行为能在一定程度上否定这种反常现象。好的观点@caf,但也许你可以留下一条评论,因为我还在完善这个答案。。。编辑它有点咄咄逼人。
int cdq(int eax)
{
    return eax < 0? -1 : 0;
}
int32_t foo = -0x12345678;
int64_t bar = (int64_t)foo;