当前位置: 代码迷 >> C# >> 关于位移的一点疑问
  详细解决方案

关于位移的一点疑问

热度:100   发布时间:2016-05-05 05:14:14.0
关于移位的一点疑问
  int a = 12;
            if (!BitConverter.IsLittleEndian)
            {
                a = (int)(((a & 0xff) >> 24) | ((a & 0xff00) >> 8) |((a&0xff0000)<<8) |((a&0xff000000)<<24));
            }
            Console.WriteLine(a);
            Console.Read();
在这里做完移位之后,发现右边移位操作的结果会变成 long类型的变量,为什么会变成long类型而不是原来的int类型呢
------解决思路----------------------
因为执行了左移位,相当于乘法,进位了,int型很可能会放不下,所以默认给你变成long型,你不想保留高位(溢出的部分)再自己强制转换
否则默认给你按int型截断,你想保留高位,信息已经丢失,找不回来了
------解决思路----------------------
我猜的啊。。。

0xff000000这个是16进制,每一位对应二进制4位ff000000就是8个1,24个0总共32位

(a&0xff000000)<<24再左移24位就有56位有效位了超过了int的4个字节,自动变成了long型

C#的跨类型计算是网精度高的隐性转换char->int->long->double->string,所以逻辑或运算的结果取long型
  相关解决方案