为什么下面的代码会产生不同的结果

本文关键字:结果 代码 为什么 | 更新日期: 2024-09-23 22:10:20

这些是128位XorShift PRNG的函数,通过查看代码,我从未想过类型(Int32/UInt32)的差异可能会产生不同的结果。在这两种情况下,我们都操作相同的比特集,这些比特向左或向右移动了相同数量的字节,为什么我们会得到不同的结果?

Int32 XorShift128(Int32 x, Int32 y, Int32 z, Int32 w)
{
    var t = x ^ (x << 11);
    x = y;
    y = z;
    z = w;
    return w = w ^ (w >> 19) ^ t ^ (t >> 8);
}
UInt32 XorShift128(UInt32 x, UInt32 y, UInt32 z, UInt32 w)
{
    var t = x ^ (x << 11);
    x = y;
    y = z;
    z = w;
    return w = w ^ (w >> 19) ^ t ^ (t >> 8);
}
void Main()
{
    Random rand = new Random();
    for (var i = 0; i < 10000000; i++) {
        var x = rand.Next();
        var y = rand.Next();
        var z = rand.Next();
        var w = rand.Next();
        var u = XorShift128(x,y,z,w);
        var v = XorShift128((UInt32)x,(UInt32)y,(UInt32)z,(UInt32)w);
        if ((Int32)v != u) {
            Console.WriteLine(x);
            Console.WriteLine(y);
            Console.WriteLine(z);
            Console.WriteLine(w);
            Console.WriteLine(u);
            Console.WriteLine((Int32)v);
            Console.WriteLine("-----------------");
        }
    }
}

为什么下面的代码会产生不同的结果

由于系统发育:,在评论中提供了答案

-2 >> 1 == -1