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 |