意外的C#位右移结果

意外的C#位右移结果,c#,bit-shift,C#,Bit Shift,我低估了>操作符的复杂性;这不是我想的那样 我想右移6542454的uint值。我以为是这样的: val(is)==110001111101010001110110 val>>1==1100011111010100001110111 val>>2==11000111110101000011101 val>>3==110001111101010001110 val>>4==11000111110101000111 val>>5==1100011111010100011 val>>6==110001

我低估了
>
操作符的复杂性;这不是我想的那样

我想右移6542454的
uint
值。我以为是这样的:

val(is)==110001111101010001110110

val>>1==1100011111010100001110111

val>>2==11000111110101000011101

val>>3==110001111101010001110

val>>4==11000111110101000111

val>>5==1100011111010100011

val>>6==110001111101010001

val>>7==11000111101000

事实上,结果是:

val>>1==1100011111010100001110111

val>>2==11000111110101000011101

val>>3==111111001100110010011

val>>4==11111100110011001001

val>>5==11111001001100100

val>>6==11111 001100100110010

val>>7==10011011111110111100

第三次手术很明显做了一些我不理解的事情,从那以后事情就偏离了轨道。似乎在第七次手术中又做了我不明白的事情

连续7次使用
>=
运算符可以生成我期望的值:

val>>=1==110001111101010001110111

val>>=1==11000111110101000011101

val>>=1==110001111101010001110

val>>=1==11000111110101000111

val>>=1==1100011111010100011

val>>=1==110001111101010001

val>>=1==11000111101000

为什么
val>>3
产生的结果与对
val>>=1的3次调用的结果不同

更新:

这是我的错。当从VisualStudio复制并粘贴十进制值时,我没有注意到截断的发生


被移位的实际值是654245426,正如每个人都正确指出的那样,C对该值进行了完美的位移位。

我编写了代码来输出每个移位:

uint i = 6542454;

for (int j = 0; j < 8; j++)
{
    uint k = i >> j;
    Console.WriteLine("{1} = {0}", Convert.ToString(k, 2), k);
}

你能提供一个简单的示例程序来复制这个问题吗?您描述的行为违反了C#规范,因此值得检查您是否有其他问题,例如计算移位的代码中的运算符优先级问题。您能否显示用于打印值的代码?您>>3在Dec(8178067)中显示几乎正确的结果,而不是817806。所以我猜你的打印代码是关闭的…是的,我只是做了同样的,我也得到了预期的结果。
6542454 = 11000111101010001110110
3271227 = 1100011110101000111011
1635613 = 110001111010100011101
817806 = 11000111101010001110
408903 = 1100011110101000111
204451 = 110001111010100011
102225 = 11000111101010001
51112 = 1100011110101000