C# C语言中的字节溢出概念#
我已经开始学习C#,需要澄清一些关于overflown概念的困惑。正如我们所知,如果超过任何数据类型的限制,C#只返回0 例如:字节b=255; 如果我们将b的值增加1,那么b的值将为0。对于下面的代码,我得到的输出为256C# 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;
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);