Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按位运算求值为long_C#_Casting_Bit Manipulation_Bitwise Operators_Logical Operators - Fatal编程技术网

C# 按位运算求值为long

C# 按位运算求值为long,c#,casting,bit-manipulation,bitwise-operators,logical-operators,C#,Casting,Bit Manipulation,Bitwise Operators,Logical Operators,我一直在把一些Java代码转换成C语言,结果遇到了一点麻烦。MSDN上的所有文档都建议所有按位操作都返回正在操作的类型。请看:但我的intellisense一直告诉我,您“不能隐式地将类型‘long’转换为‘int’。”下面这一行就是有问题的那一行,对我来说,其中的所有文本看起来都是int,所有操作的类型都是int或uint。我错过了什么?我甚至没有在我的文件中声明任何长变量,下面的所有变量都是int类型。转换为uint是为了保留java(>>>的无符号位移位运算符 intt1=((s13>66

我一直在把一些Java代码转换成C语言,结果遇到了一点麻烦。MSDN上的所有文档都建议所有按位操作都返回正在操作的类型。请看:但我的intellisense一直告诉我,您“不能隐式地将类型‘long’转换为‘int’。”下面这一行就是有问题的那一行,对我来说,其中的所有文本看起来都是int,所有操作的类型都是int或uint。我错过了什么?我甚至没有在我的文件中声明任何长变量,下面的所有变量都是int类型。转换为uint是为了保留java(>>>的无符号位移位运算符

intt1=((s13>66-64))^((s13>93-64));

当使用int操作uint时,结果很长。当然

int t1 = (int)((((uint)s13 << 96 - 66) | ((uint)s12 >> 66 - 64)) ^ (((uint)s13 << 96 - 93) | ((uint)s12 >> 93 - 64)));
intt1=(int)((uint)s13>66-64))^((uint)s13>93-64));

注意:c#编译器是智能的,可以处理常量。所以(uint)s | 1是uint,因为它可以静态地确定它。

表达式的哪个部分导致提升为long?这个部分会:
((s13>66-64))
那么
int | uint->long
?(看起来比这更微妙。使用int文本会改变行为。)
uint | 1->uint
。如此混乱的C#编译器!回到这一点上来,人们实际上期望这种行为不会令人困惑。当你有一个正整数文本,它对于一个整数来说太大了,但是可以放在一个uint中,它会自动接受这个文本并使它成为一个uint。但是,如果添加int和uint,为了保持int的有符号性质,编译器将采用下一个最大的有符号类型,即long。通过这种方式,它保持int的有符号性,并且知道它可以适应uint!
int t1 = (int)((((uint)s13 << 96 - 66) | ((uint)s12 >> 66 - 64)) ^ (((uint)s13 << 96 - 93) | ((uint)s12 >> 93 - 64)));