关于C#字节数组:C#字节数组 – 有符号和无符号两难

C# byte arrays - signed and unsigned dilemma

我从有符号字节数组开始,然后转换为无符号。那么打印的结果是正确的吗?

1
2
byte[] unsigned = new byte[] {10,100,120,180,200,220,240};
sbyte[] signed = Utils.toSignedByteArray(unsigned);

打印(我只是用一个StringBuilder附加了它们):

签名:【10101020,-76,-56,-36,-16】
未签名:【10100120180200220240】

哪里:

1
2
3
4
5
public static sbyte[] toSignedByteArray(byte[] unsigned){
    sbyte[] signed = new sbyte[unsigned.Length];
    Buffer.BlockCopy(unsigned, 0, signed, 0, unsigned.Length);
    return signed;
}

如果我改成这个,我会得到同样的结果。

1
sbyte[] signed = (sbyte[])(Array)unsigned;

不应该-128(signed)变为0,-118变为10,依此类推。而不是10(有符号)=10(无符号)!?

因为
sbyte-128至127
字节0至255

那么??


有符号整数在二的补码系统中表示。

实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
Bits        Unsigned     2's complement
            value        value

00000000    0            0
00000001    1            1
00000010    2            2
01111110    126          126
01111111    127          127
10000000    128          ?128
10000001    129          ?127
10000010    130          ?126
11111110    254          ?2
11111111    255          ?1