C# C语言中的字节溢出概念#

C# C语言中的字节溢出概念#,c#,.net,C#,.net,我已经开始学习C#,需要澄清一些关于overflown概念的困惑。正如我们所知,如果超过任何数据类型的限制,C#只返回0 例如:字节b=255; 如果我们将b的值增加1,那么b的值将为0。对于下面的代码,我得到的输出为256 using System; namespace HelloWorld{ class program{ static void Main(){ byte b = 255;

我已经开始学习C#,需要澄清一些关于overflown概念的困惑。正如我们所知,如果超过任何数据类型的限制,C#只返回0

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

 using System;
 namespace HelloWorld{
     class program{
          static void Main(){
                  byte b = 255;
                  Console.WriteLine(b+1);
           }
       }
  }
我得到的输出不是0,而是256,这超出了byte类型b的限制。这怎么可能

using System;
namespace HelloWorld{
class program{
    static void Main(){
        byte b = 255;
        b = b+1
        Console.WriteLine(b);
    }
}
对于上面的代码,我得到了编译错误,即错误CS0266:无法将类型
int'隐式转换为
byte'。存在显式转换(是否缺少强制转换?)

救命啊

关于编译错误和256的查询的(提示)答案在以下代码段的输出中:

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

256, System.Int32 <-- not `byte`
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)

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

在第二个示例中,您尝试再次将一个整数转换为一个字节,然后将结果重新分配给一个字节,这在没有强制转换的情况下是不可能的

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

双重或浮动也一样

float f = 0.1;
double d = 0.1;
var x = f + d; // x is a double
为了避免自动转换,您需要像
b+(byte)1那样强制转换

为了避免自动转换,您需要像
(字节)(b+1)
(谢谢@fubo)那样强制转换

这会引发一个错误,因为b的类型为byte,它将1作为int-literal。你需要在这里进行类型转换

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

这将为您提供0。

“正如我们所知,如果超出任何数据类型的限制,C#只会返回0。”不,它会自动换行。由于某些原因(但在本例中,您添加的是int-literal–1–无论如何,这是有意义的);b++为您提供了预期的结果这里没有为
字节定义运算符
+
。因此,编译器会自动为
int
使用一个。这同样适用于
short
char
以及其他一些整数类型。它应该是(byte)(b+1)。这里没有显示类型转换。您需要将1转换为字节'b+=convert.ToByte(1);'刚好
b+=1就可以了。这与
b=b+1有细微的区别在转换方面。
byte b = 255;
b = b + 1;
 byte b = 255;
 b++;
 Console.WriteLine(b);