在c#中将bool表达式转换为char

Vla*_*myh 23 c# clr

当我遇到类似下面的问题时,我通过了.NET测验.

Char ch = Convert.ToChar('a' | 'e' | 'c' | 'a');
Run Code Online (Sandbox Code Playgroud)

在控制台中我们可以看到ch变量的输出是g.

有人可以描述发生了什么吗?谢谢!

Zim*_*mm1 34

"|" 是二元OR运算符.

'a' binary representation is 01100001
'e' binary representation is 01100101
'c' binary representation is 01100011
Run Code Online (Sandbox Code Playgroud)

结果OR01100111,其char表示为g


Zei*_*kki 21

这不是第一个看起来的样子.它更多的int是对这些表示的二进制计算Char:

这是一篇完整的文章,用例子解释这个:文章

所以Or这些按位的二进制结果'a' | 'e' | 'c' | 'a'103.如果将其转换为Char,则为g

编辑:

虽然我应该得到更多细节,但我认为这个答案比我更受关注.

从C#编译器端:

有一个从char到int(int i = 'a'compiles)的隐式转换,所以编译器实际上做的是:

Convert.ToChar((int)'a' | (int)'e' | (int)'c' | (int)'a');
Run Code Online (Sandbox Code Playgroud)

由于这些是硬编码值,编译器会做更多工作:

Convert.ToChar(97 | 101 | 99 | 97);
Run Code Online (Sandbox Code Playgroud)

最后:

Convert.ToChar(103); // g
Run Code Online (Sandbox Code Playgroud)

如果这些不是硬编码值:

private static char BitwiseOr(char c1, char c2, char c3, char c4)
{
    return Convert.ToChar(c1 | c2 | c3 | c4);
}
Run Code Online (Sandbox Code Playgroud)

使用Roslyn你会得到:

private static char BitwiseOr(char c1, char c2, char c3, char c4)
{
    return Convert.ToChar((int)c1 | c2 | c3 | c4);
}
Run Code Online (Sandbox Code Playgroud)

转换为IL(使用or(按位)IL指令):

.method private hidebysig static char  BitwiseOr(char c1,
                                                   char c2,
                                                   char c3,
                                                   char c4) cil managed
  {
    // 
    .maxstack  2
    .locals init (char V_0)
    IL_0000:  nop
    IL_0001:  ldarg.0
    IL_0002:  ldarg.1
    IL_0003:  or
    IL_0004:  ldarg.2
    IL_0005:  or
    IL_0006:  ldarg.3
    IL_0007:  or
    IL_0008:  call       char [mscorlib]System.Convert::ToChar(int32)
    IL_000d:  stloc.0
    IL_000e:  br.s       IL_0010

    IL_0010:  ldloc.0
    IL_0011:  ret
  } // end of method Program::BitwiseOr
Run Code Online (Sandbox Code Playgroud)


Off*_*'er 10

转到unicode-table.

  • 'a'十进制值97的二进制它01100001.
  • 'e'二进制的十进制值是10101100101.
  • 'c'十进制值99的二进制它01100011.
  • 'a' 十进制值97的二进制它01100001.

或者操作员有点明智'|'.所以你的表达式等于:

01100001 OR
01100101 OR
01100011 OR
01100001,结果如下
01100111.

导致1,如果有至少一次1列.

01100001转换为十进制是103.
我们将再次访问unicode表,我们将看到deciaml 中的103等于'g'.

所以你问这个函数做了什么,它计算二进制值然后将它转换为Decimal值并返回它的unicode字符.

  • @VladislavHromyh,这就是你使用`Convert.ToChar()`将int转换回一个字符的原因. (2认同)