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日