C# 字节数组 - 有符号和无符号困境

本文关键字:符号 无符号 困境 字节 字节数 数组 | 更新日期: 2023-09-27 18:33:17

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

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

还有打印(我只是用 StringBuilder 附加它们):

签名: [10,100,120,-76,-56,-36,-16]
未签名 : [10,100,120,180,200,220,240]

哪里:

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

如果我更改为此,我会得到相同的结果。

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

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

因为
字节 -128 到 127
字节 0 到 255

所以??

C# 字节数组 - 有符号和无符号困境

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

例子:

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