我有一段代码,其中类型转换返回的值与较大的值相差很大。
static void Main(string[] args)
{
double a = 345.09;
byte c = (byte) a;
Console.WriteLine(c);
Console.ReadLine();
}
这将返回值为89
。这背后的原因是什么?
我有一段代码,其中类型转换返回的值与较大的值相差很大。
static void Main(string[] args)
{
double a = 345.09;
byte c = (byte) a;
Console.WriteLine(c);
Console.ReadLine();
}
这将返回值为89
。这背后的原因是什么?
发生的情况是,当你将数字转换时,只有最后8位被取出。让我通过使用整数举个例子来解释。我使用整数是为了简单起见,因为如果你将double
转换为非浮点数表示,小数部分无论如何都会被舍弃。
首先,我们看一下数字345的二进制表示:
string binaryInt = Convert.ToString(345, 2);
Console.WriteLine(binaryInt);
输出结果为:
1 0101 1001
现在我们只取最后8位,这是一个byte
类型的大小:
string eightLastBits = binaryInt.Substring(binaryInt.Length-8);
Console.WriteLine(eightLastBits);
我们得到:
0101 1001
如果我们再次将其转换为byte
,你会看到结果是89:
byte backAgain = Convert.ToByte(eightLastBits, 2);
Console.WriteLine(backAgain);
输出:
89
编辑:
正如InBetween指出的那样,int示例是真正的情况,也是在强制转换期间发生的。
查看将double转换为byte的实现:
/// <internalonly/>
byte IConvertible.ToByte(IFormatProvider provider) {
return Convert.ToByte(m_value);
}
如果我们查看Convert.ToByte方法的实现:我们可以看到双精度浮点数首先被转换为整数:
public static byte ToByte(double value) {
return ToByte(ToInt32(value));
}
byte
类型长度范围的原因。二进制中的 255
等于 11111111
(8 位数的最大值)。酷,今天我学到了一个新东西。每一天都是一个学校的日子。 - Prasad Telkikarbyte
)可以存储从0
到255
的数字,有符号字节(在.net中为SByte
)可以使用二进制补码存储从-128
到127
的数字。 - Heinziint
实际上并不是一个例子,它是真正发生的事情:(byte)a
在强制转换为 byte
之前调用了 a.ToInt32()
,因此代码本质上是 (byte)(int)a
。 - InBetweenByte 的范围 是从 0 到 255,你之所以得到了 89 的结果,是因为一旦超过 255,它会重新从 0 开始计数。即
byte c = (byte) a; //345 - 255 (consider `0` as well)
Console.WriteLine(c); // i.e. 89
byte
存储8位数据。将0000 0000
和1111 1111
(8位二进制数据)的值分别定义为byte
变量的Min
和Max
值,因此在整数中它变成了0
和255
float
或 double
转换为整数类型,处理取决于转换发生的溢出检查上下文(checked 和 unchecked 运算符):0
与 89
一样有效。