在微软的问题区晃了一下,发现有人提出这样的问题,有些意思,看来.net智能化还有待改进。
Question:
在visual C#中,不管你声明的变量是什么类型,值类型总是会先被转换位int类型,然后才会进行按位左移操作,即使是强制类型转换也于事无补。举个例子来说吧:
byte A=188;
congsole.writeline(A<<8);
即使A是声明为byte类型的,可是它会隐式转换为int类型,然后才会进行按位左移
即使这样也没用:
console.writeline((byte)A<<8);
我想请教的是如何才能使A不转换成int类型,而是以byte类型的方式存在,然后才进行按位左移操作?
呵呵,左移8位,最后肯定超出byte的最大值255了,让你直接转换的话就会溢出了,既然微软不给转回来,只能自己动手了,源码如下:
byte A = 188;
Console.WriteLine(A<<8);
int B = A << 8;
byte C =Convert.ToByte(B & 0xff);
Console.WriteLine(C);
Console.ReadLine();
int是32位的,byte是8位的,取0xff,既二进制的11111111,亦即00000000 00000000 00000000 11111111 与原来的数字按位与一下,将高位全部舍弃,控制最终的结果处于byte的取值范围以内,就可以了。
PS:哪位高人能够解答一下:
Convert.ToByte(B & 0xff) 和 (Byte)(B & 0xff))的区别呢?都是强制转换,有时就不能用第二个,困惑中......