C#中的余数运算符的执行与Visual Basic中的MOD不同
本文关键字:Basic 中的 MOD Visual 不同 执行 余数 运算符 | 更新日期: 2023-09-27 18:24:11
我发现了一种奇怪的情况,将一段代码从C#转换为VB.NET,该代码是一个从基数10转换为基数36的小类,反之亦然。
关键是这个功能:
/// <summary>
/// A Base36 De- and Encoder
/// </summary>
public static class Base36
{
private const string CharList = "0123456789abcdefghijklmnopqrstuvwxyz";
/// <summary>
/// Encode the given number into a Base36 string
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static String Encode(long input)
{
if (input < 0) throw new ArgumentOutOfRangeException("input", input, "input cannot be negative");
char[] clistarr = CharList.ToCharArray();
var result = new Stack<char>();
while (input != 0)
{
result.Push(clistarr[input % 36]);
input /= 36;
}
return new string(result.ToArray());
}
在VB.NET中转换的应导致:
Public NotInheritable Class Base36
Private Sub New()
End Sub
Private Const CharList As String = "0123456789abcdefghijklmnopqrstuvwxyz"
''' <summary>
''' Encode the given number into a Base36 string
''' </summary>
''' <param name="input"></param>
''' <returns></returns>
Public Shared Function Encode(input As Int64) As String
If input < 0 Then
Throw New ArgumentOutOfRangeException("input", input, "input cannot be negative")
End If
Dim clistarr As Char() = CharList.ToCharArray()
Dim result = New Stack(Of Char)()
While input <> 0
result.Push(clistarr(input Mod 36))
input /= 36
End While
Return New String(result.ToArray())
End Function
问题是VB.NET中的模运算符与C#中的%余数运算符的执行方式不同,事实上,如果您在C#中调用encode方法:
long l = 13072113072399;
string result = Base36.Encode(l); //Result is : 4mt8um0b3
在C#中调用方法时:
Dim l As Int64 = 13072113072399
Dim result As String = Base36.Encode(l) //Result is : 5nujsu3ar
造成差异的原因是模运算符在某些情况下返回的不同结果,为什么?
VB.NET中%余数运算符的等效项是什么?
Mod
运算符:
clistarr(input Mod 36)
但实际问题是
input /= 36
在C#中,当在两个int
上使用时,/
是整数除法。在VB.NET中,/
是Integer
上的Double
,它使用银行家取整。将其更改为整数除法:
input '= 36
或者正确使用DivMod
:
input = Math.DivRem(input, 36, remainder)