【问题标题】:How does type casting work from double to byte类型转换如何从双字节转换为字节
【发布时间】:2021-05-25 06:36:10
【问题描述】:

我有一个代码,其中类型转换返回的值与较大的值大不相同。

static void Main(string[] args)
{
    double a = 345.09;
    byte c = (byte) a;
    Console.WriteLine(c);
    Console.ReadLine();
}

这将返回值89。背后的原因是什么?

【问题讨论】:

标签: c# .net


【解决方案1】:

发生的情况是,当您转换数字时,只取最后 8 位。让我用一个使用整数的例子来解释。为了简单起见,我使用 int,因为如果您将 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转换的implementation

/// <internalonly/>
byte IConvertible.ToByte(IFormatProvider provider) {
    return Convert.ToByte(m_value);
}

如果我们查看 Convert.ToByte 方法的实现:我们会看到 double 如果首先转换为整数:

public static byte ToByte(double value) {
    return ToByte(ToInt32(value));
}

【讨论】:

  • 我猜这是字节类型范围背后的原因。 255 in binary = 11111111(max limit of 8 bits) 酷我今天学到了一个新东西。每天都是上学日..
  • @PrasadTelkikar:没错。一个无符号字节(C# 中的byte)可以存储一个从0255 的数字,一个有符号字节(.net 中的SByte)一个从-128127 的数字,使用two's complement
  • 完美的解释。得学习新东西。所有其他答案都可以解释,但由于这是深入的,所以会给出已接受答案的标记(这并不意味着其他答案是错误的)。
  • +1。使用int 实际上不是一个示例,而是真正发生的情况:(byte)a 在转换为byte 之前调用a.ToInt32() 所以代码本质上是(byte)(int)a
  • @InBetween 你能给我这个信息的链接吗?我将调整我的答案并将其纳入其中。谢谢。或者你可以简单地编辑它,我确认编辑。
【解决方案2】:

Range of byte 从 0 到 255,你得到的结果是 89,因为一旦超过 255,它就会从 0 重新开始计数。即

byte c = (byte) a;  //345 - 255  (consider `0` as well)
Console.WriteLine(c); // i.e. 89

字节范围背后的原因:

byte 存储 8 位数据。 0000 00001111 1111(8 位二进制数据)值可以是 分别定义为MinMax 值到byte 变量,所以 整数变成0255

【讨论】:

    【解决方案3】:

    请注意,这是少数未指定结果的情况之一。

    来自language spec,省略不相关的情况

    对于从floatdouble 到整数类型的转换,处理取决于发生转换的溢出检查上下文(检查和未检查运算符):

    在未经检查的上下文中,转换始终成功,并按如下方式进行。

    如果操作数的值为 NaN 或无穷大,[...]

    否则,源操作数将向零舍入到最接近的整数值。如果这个整数值在目标类型的范围内,[...]

    否则,转换的结果是目标类型的未指定值

    据推测,该实现只是在转换为最接近的整数值后去掉了高位,只留下最低有效的 8 位,因为这可能是当时最方便的做法。但请注意,根据此规范,对于此转换,089 一样是有效值。

    【讨论】:

      猜你喜欢
      • 2018-08-17
      • 2018-08-20
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 2017-05-30
      相关资源
      最近更新 更多