当我编写相同的算法时,为什么c#中的代码与c中的代码不同?

时间:2019-02-23 11:37:04

标签: c# c

C函数

unsigned long int ROTL(unsigned long int x, unsigned long int  y)
    {
        return ((x) << (y&(32 - 1))) | ((x) >> (32 - (y&(32 - 1))));
    }

C#中的功能

 uint ROTL(uint x, uint y) 
   { 
       return ((x) << (int)(y & (32 - 1))) | ((x) >> (int)(32- (y & (32 - 1)))); 
   }

对于较小的数字,上述功能可以完成相同的工作,并获得相同的结果, 但是当我传递大量数字时,C#中的结果不同于C。

转换或函数本身是否有问题?我也尝试使用

进行转换
Convert.ToInt32()

1 个答案:

答案 0 :(得分:0)

假设unsigned long int转换为您想与C#ulong而不是uint一起使用的无符号64位整数。

主要问题在于,y参数没有强制转换为int,因为无论如何它只占用最后5位。但是,当x的类型为uint时,(最坏的情况)31个位的移位远远超过了其限制。 强制转换并将其返回到ulong即可解决问题。

ulong ROTL(uint x, uint y) 
{ 
    return (((ulong)x) << (int)(y & (32 - 1))) | (((ulong)x) >> (int)(32 - (y & (32 - 1)))); 
}

请注意,我没有对此进行全面测试,仅进行了一些边界测试:https://dotnetfiddle.net/0ETAEL

编辑:当您期望结果大于2 ^ 64(或作为参数值:ROTL(uint.MaxValue, 31))时,您应该考虑看看BigInteger