为什么这个分配会产生一个comile错误:Constant value '-2147483648' cannot be converted to a 'ulong'我必须使用unchecked (...)这个案例?
ulong xDummy30 = (1 << 30); // works
ulong xDummy31 = (1 << 31); // ERROR 25 Constant value '-2147483648' cannot be converted to a 'ulong'
ulong xDummy32 = (1 << 32); // works
Run Code Online (Sandbox Code Playgroud)
使用它代替工作:
ulong xDummy31a = unchecked((ulong)(1 << 31));
// or
ulong xDummy31b = (1ul << 31); // comment from Regis Portalez
Run Code Online (Sandbox Code Playgroud)
根据MSDN ulong引用,所有整数文字1,30,31都被视为int:
当整数文字没有后缀时,它的类型是这些类型中的第一个,其值可以表示为:int,uint,long,
根据MSDN <<运算符,<< operation的结果也是一个int.当你移动30时,结果是正的,当移动31时,结果是负的int,不能分配给ulong.
编辑:HVD在下面指出了一个错误.谢谢HVD!
启动错误 - 当移位32位时,编译器知道你想要一个ulong,因此移位操作的结果是一个正长,可以转换为一个unlong - end错误
1 << 32不会导致编译器错误的正确原因在于提供者对运算符<<的链接:
如果第一个操作数是int,则移位计数由第二个操作数的低位5位给出.也就是说,实际移位计数是0到31位.
32到二进制:0010 0000; 低位五位:0 0000,所以实际执行的移位是1 << 0,这导致int值为1,当然可以将其分配给ulong.
要解决此问题,请确保您的数字1很长.在那种情况下,1 << 31仍然是一个正长.
您还可以根据以下规则使用后缀来指定文字的类型:如果使用L,则文字整数的类型将根据其大小为long或ulong.
所以1L很长; 1L << 31是正长,因此可以分配到ulong
| 归档时间: |
|
| 查看次数: |
833 次 |
| 最近记录: |