sbyte表示一种整型数据,它的范围是-128到+127,它是一个有符号的8位整数,在.NET中与之对应的是System.Sbyte。
C#中的byte类型的范围是0-255。它们两者都只能表示256个数值,只不过,一个有符号,一个没有符号。为什么有符号的sbyte的范围是-128到+127呢?
首先8位的二进制数据的范围本来应该是00000000-11111111,然后我们分两种情况来讨论。
第一种情况,在无符号的byte类型二进制数据中,直接将00000000视为0(十进制),将11111111视为255(十进制)。
第二种情况,在有符号的sbyte类型中,左边第一位表示符号位,0表示正数,1表示负数,所以01111111表示一个sbyte最大的正数,也就是127。而负数的二进制在计算机中表示为正数的补码,补码等于反码加1,所以128的反码用二进制表示是01111111,再加1得到补码为10000000。注意,10000000在无符号二进制状态下,它本来是128,而在有符号数中,通常将最高有效位为0的认为是正数,最高有效位为1的认为是负数,因此1000 0000就表示为-128了。所以8位有符号整数的范围是-128~127
观察下面这个例子
internal class Program
{
static void Main(string[] args)
{
sbyte min_sbyte = -128;
SByte max_sbyte = 127;
Console.WriteLine($"min_sbyte={min_sbyte}");
Console.WriteLine($"max_sbyte={max_sbyte}");
Console.WriteLine($"MinValue ={sbyte.MinValue}");
Console.WriteLine($"MaxValue ={sbyte.MaxValue}");
short a = -129;
sbyte age = (sbyte)a;
Console.WriteLine($"将-129转为sbyte={age}");
short b = +128;
age = (sbyte)b;
Console.WriteLine($"将+128转为sbyte={age}");
var v = Console.ReadKey();
}
}
输出结果:
min_sbyte=-128
max_sbyte=127
MinValue =-128
MaxValue =127
将-129转为sbyte=127
将+128转为sbyte=-128
为什么将-129转为sbyte=127?将+128转为sbyte=-128?这里和上一节关于byte的超出范围转换是一样的道理。
比如+128这个数,二进制表示为10000000,由于第一位表示为符号位,所以10000000=-0,-0就看成是sbyte的最小值,可不就是-128嘛。
——重庆教主 2023年12月25日