C#中的字节溢出概念

时间:2018-07-30 05:42:58

标签: c# .net

我已经开始学习C#,需要清除对溢出概念的一些困惑。我们知道,如果超出任何数据类型的限制,C#只会返回0。

例如:字节b = 255;      如果我们将b的值增加1,那么b的值将为零。对于下面的代码,我的输出为256。

 using System;
 namespace HelloWorld{
     class program{
          static void Main(){
                  byte b = 255;
                  Console.WriteLine(b+1);
           }
       }
  }

而不是0,我得到的输出是256,超出了类型字节b的限制。这怎么可能?。

using System;
namespace HelloWorld{
class program{
    static void Main(){
        byte b = 255;
        b = b+1
        Console.WriteLine(b);
    }
}

对于上述代码,我遇到编译错误,即错误CS0266:无法隐式转换类型int' to byte'。存在显式转换(您是否缺少演员表?)

帮助!!!!

3 个答案:

答案 0 :(得分:7)

以下代码段的输出中包含有关编译错误和256的查询的(线索)答案:

byte b = 255;
Console.WriteLine($"{b + 1}, {(b+1).GetType()}");
Console.ReadLine();

输出:

256, System.Int32 <-- not `byte`

关于包装,我认为以下片段很好地说明了这一概念。

for (int i = 250; i < 260; i++)
{
     byte b = (byte)i;
       Console.WriteLine($"{i} => {b,3} ({Convert.ToString(b, 2).PadLeft(8, '0')})");
}

输出:

250 => 250 (11111010)
251 => 251 (11111011)
252 => 252 (11111100)
253 => 253 (11111101)
254 => 254 (11111110)
255 => 255 (11111111)
256 =>   0 (00000000)
257 =>   1 (00000001)
258 =>   2 (00000010)
259 =>   3 (00000011)

答案 1 :(得分:1)

byte b = 255;
b = b + 1;

这将引发错误,因为b的类型为byte且将1作为int常量。您需要在此处进行类型转换。

 byte b = 255;
 b++;
 Console.WriteLine(b);

这将给您0。

答案 2 :(得分:0)

这里有点不同。 在您的第一个示例中,表达式b+1被转换为整数,因为1本身始终是整数,因此输出为256

在第二个示例中,您尝试将整数再次设置为一个字节,然后再次将其转换为整数,然后将结果分配回一个字节,如果不进行强制转换,则是不可能的。 / p>

因此,在c#中,将数字相加时,结果将自动转换为可以容纳较大值的类型。

相同的代表两倍或浮动。

float f = 0.1;
double d = 0.1;
var x = f + d; // x is a double

为避免自动转换,您需要像b + (byte)1

为避免自动转换,您需要像(byte)(b + 1)一样投射(感谢@fubo)