为什么我不能在字节变量中存储负值?

use*_*725 8 c# byte

我正在转换使用Java但不适用于C#的代码

byte[] buffer = new byte[64];
this.buffer[((int)this.count & 0x3F)] = -128;
Run Code Online (Sandbox Code Playgroud)

这会产生编译时错误"常量值'-128'无法转换为'字节'." 如何为一个字节存储负数?

Joh*_*mse 16

在C#中,a byte表示无符号的 8位整数,因此不能保持负值(有效值范围为0to 255).另一种方法是sbyte,它是一个带符号的 8位整数(来自-128to的有效值127).


dtb*_*dtb 6

byteJava中的数据类型已签名(-128-127).C#中的等效数据类型是sbyte.

所以等效的C#代码如下:

sbyte[] buffer = new sbyte[64];
buffer[..] = -128;
Run Code Online (Sandbox Code Playgroud)

如果需要无符号字节数组(0-255),则bytesbyte-128 具有相同位模式的是128(0x80).

byte[] buffer = new byte[64];
buffer[..] = 128;
Run Code Online (Sandbox Code Playgroud)

另请参见: 积分类型表(C#参考)

  • 为了补充,你当然也可以迫使演员发生.这样就完成了(当`buffer`是`byte []`)时:**`buffer [index] = unchecked((byte)( - 128));`**`unchecked(...)`当满足两个条件时,可以省略part:_1:_要转换的值是**而不是**编译时常量,而_2:_代码是****不是用[`/ checked`编译的编译器选项](http://msdn.microsoft.com/en-us/library/h25wtyxf.aspx).所以在这些情况下你只会说`buffer [index] =(byte)nonConstant;`. (2认同)