C++ C/C++;检查位31是否设置为无符号整数
我试着检查一个无符号整数中是否设置了一个位。我不确定怎么做,但我想应该是这样的。我试图在C++(但是一个函数)中实现CDQ指令 这是我的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被设置为(
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;