或者-ing字节C#给int[重复]
-
06-07-2019 - |
题
这个问题已经有一个答案在这里:
- 左位移255(作为一个字节) 7的答案
我有这个代码。
byte dup = 0;
Encoding.ASCII.GetString(new byte[] { (0x80 | dup) });
当我试图汇编的我会得到:
无法隐含的转型'int' 来'字节的'.一个明确的转换 存在(是否缺少一个铸的?)
为什么这种事发生?不|两字节得到一个字?以下两种工作,确保每一个项目是字节。
Encoding.ASCII.GetString(new byte[] { (dup) });
Encoding.ASCII.GetString(new byte[] { (0x80) });
解决方案
就是这样通过设计,而且,事实上,可以追溯到C/C++-后者还促进操作数 int
, 你只是通常没有注意到因为 int -> char
转换还是隐含的,虽然它不是。这并不仅仅适用于 |
但是所有的算术和位的操作数-例如添加两个 byte
会给你一个 int
为好。我要引用的相关部分的规格:
二进制数字,促进发生 操作数的预定+,–, *, /, %, &, |, ^, ==, !=, >, <,>=, <=二进制的运营商。二进制 数字隐含地促进转换 两个操作数到一个共同的类型, 在情况下的非关系 经营者,也成为结果 类型的操作。二进制数字 促进由施加的 以下规则,在为了他们 出现在这里:
如果操作数的 十进制类型,其他操作数的 转型的小数,或 编制时发生错误,如果其他 操作数的类型浮动或一倍。
否则,如果操作数的 类型的双重,其他操作数的 转型倍。
否则, 如果操作数的类型浮动, 另一个操作数被转换成类型 浮动。
否则,如果操作数的 是的类无符长,其他操作数的 转化成类无符长,或 编制时发生错误,如果其他 操作数类型的符号字节、短,int, 或长。
否则,如果任 操作的类型很长,其他的 操作数转型长。
否则,如果操作数的 uint类型和其他操作数的 类型的符号字节,短,或int,既 操作数转型长。
否则,如果操作数的 uint类型,其他操作数的 转型uint。
否则, 两个操作数被转换成类型 int。
我不知道确切的理由这一点,但是我能想到的一个。为算术运营商,尤其是,它可能是一个有点令人惊讶的人 (byte)200 + (byte)100
突然等于 44
, 即使这使某种意义上说,当一个仔细考虑的类型参与。另一方面, int
通常被认为是一类型的"足够好的"用于算术上最典型的号码,以便通过促进这两个论点来 int
, 你会得到一种"工作"行为最常见的情况。
为什么这种逻辑也适用于按位运营商-我想这是如此的大部分用于一致性。它的结果在一个单一的简单的规则常见于 所有 非布尔的二进制的类型。
但是,这是所有主要猜测。埃里克利珀特大概会是一个问背后的真正动机这一决定,对C#至少(虽然这可能有点无聊如果答案是简单的"其是它是如何做C/C++、Java,这是一个足够好的规则,因为它是,那么我们认为,没有理由改变它").
其他提示
字面0x80有类型"int",所以你不是"或"字节。
你可以通过它字节[]只因为0x80(作为文本),它是范围内的字节。
编辑:即使0x80一个转换为字节,该守则将仍然不是编纂,因为"或"字节将仍然得到int。它汇编、结果或必须投: (byte)(0x80|dup)
byte dup = 0;
Encoding.ASCII.GetString(new byte[] { (byte)(0x80 | dup) });
结果一位或(|)上两个字节总是一个int.