C#中的"~"符号

C#中的"~"符号

四月 03, 2018

    今天突然觉得大学好像白上了,就像同学说我的那样,“恩,你学费没白交,最起码还有个毕业证。”哈哈哈,真的是应该自嘲一下。虽说引出这个问题的原因是查看了Unity官方教程自动寻路源码,但这也恰恰证明了我的大学基础是多么的不牢固。还是需要花些时间,重新拾起来啊(重头学啊)。

    因为上大学的主修专业是Java方向,所以没学习过C#(其实Java也基本全还给老师了)。今天抽空查了一下C#的官方文档,官方文档提供的“~”符号解释为:

~ 运算符对操作数执行按位求补运算,其效果相当于反转每一位。按位求补运算符是为 int、uint、long 和 ulong 类型预定义的。

    按位取反还记得一些,但是按位求补真的是一点都没有印象了,只知道有补码这个东西,但是知识点、怎么取,当时脑子真的是一片空白。所以找了一些资料重新回头复习了一下。发现补码原来是原码求反再加1。这里要提到几个知识点:

  • 正数的补码就是原码。
  • 负数的补码,取对应正数的反码再加1。
  • 补码的补码是原码。

images

    那么问题来了,官方文档明明说的是按位求补,但是后边又说其效果相当于反转每一位,那跟求反有什么区别呢。后来又发现了一个知识点:

  • 几乎所有的计算机都使用二进制补码表示法来存储位于n位存储单元中的有符号整数。

    也就是说“~”符号取的是计算机中补码的反码,那么正数存在存储单元中的就是本身,求反之后符号位变为1,就变成了负数。这时取反之后的结果还是存在计算机存储单元的补码,要转化为原码还需再求一次补码运算。

    同理,负数存在存储单元中的应该是自身的补码,也就是对应正数的反码加1。求反之后符号位变为0,就变成了正数,虽然这时取反之后的结果还是存在计算机存储单元的补码,需要再求一次补码才能转换为原码,但是正数的补码就是自身啊。

    到这里基本就结束了,通过这次的问题,看到了自己上大学时候对学习的一种懈怠,需要努力的地方还有很多。每一次发现自身问题和总结都是进步。