Code Bye

为什么右边移位操作的结果会变成 long类型的变量

  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型呢

 

30分
因为执行了左移位,相当于乘法,进位了,int型很可能会放不下,所以默认给你变成long型,你不想保留高位(溢出的部分)再自己强制转换
否则默认给你按int型截断,你想保留高位,信息已经丢失,找不回来了

10分
我猜的啊。。。
0xff000000这个是16进制,每一位对应二进制4位ff000000就是8个1,24个0总共32位
(a&0xff000000)<<24再左移24位就有56位有效位了超过了int的4个字节,自动变成了long型
C#的跨型计算是网精度高的隐性转换char->int->long->double->string,所以逻辑或运算的结果取long型
你不想保留高位(溢出的部分)再自己强制转换
 否则默认给你按int型截断,你想保留高位,信息已经丢失,找不回来了 
二楼的这部分怎么理解?
假如按我上面写的强制转成int会丢失信息吗?(假如在变成long型后的值,并没有超过Int的最大值)
引用 3 楼 hanfangweihaoren 的回复:

你不想保留高位(溢出的部分)再自己强制转换
 否则默认给你按int型截断,你想保留高位,信息已经丢失,找不回来了 
二楼的这部分怎么理解?
假如按我上面写的强制转成int会丢失信息吗?(假如在变成long型后的值,并没有超过Int的最大值)

如果没有超过int的最大值,只不过是丢失了一堆0而已
编译器就是防止你移动的位数过多导致把1移到了前32位去而自己又不注意


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明为什么右边移位操作的结果会变成 long类型的变量