我已经开始学习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'。存在显式转换(您是否缺少演员表?)
帮助!!!!
答案 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)