【问题标题】:Why are you allowed to supply decimal values into a byte type?为什么允许将十进制值提供为字节类型?
【发布时间】:2015-12-09 20:37:50
【问题描述】:

假设您有一个字节变量,并为它分配了十进制值 102。 (字节 myByteVariable = 102;) 为什么会这样?你不应该提供一个实际的 8 位值来避免混淆吗?以及如何通过提供位来设置字节值?

【问题讨论】:

  • 102 是整数,而不是小数。小数点是 102M,值 102.0 是双精度值。
  • 102(以 10 为底的“十进制”,而不是“二进制”或“十六进制”)是一个 8 位值。没有混乱。 C# 中没有二进制文字。
  • 因为编译器允许你输入十进制数,所以这样很友好。 102 很容易放入一个字节中,它只需要 7 位即可编码。
  • @MattJohnson 我的意思是十进制的十进制数。
  • 请记住,您也可以使用十六进制:byte myByteVariable = 0x66;

标签: c#


【解决方案1】:

byte 可以存储 8 位(即从 0 到 255 的值)。 short 存储 16 位,int 32 等。C# 中的每种整数类型都允许存储更广泛的数字。 C# 允许您为任何这些类型分配一个整数。

为了单独设置每个位,您需要使用bitwise operators

实际上,我在不久前写了一个library 来处理这个问题,允许您使用data[x] 设置字节的每一位。它与BitArray 类非常相似(我不确定我何时知道它)

它的主要思想是:

private byte data;

public void SetBit(int index, bool value)
{
    if (value)
        data = (byte)(data | (1 << index));
    else
        data = (byte)(data & ~(1 << index));
}

public bool GetBit(int index)
{
    return ((data & (1 << index)) != 0);
}

【讨论】:

  • 那么使用base 10数字设置字节是为了保持一致性?
【解决方案2】:

byte 是十进制类型,代表十进制数,不代表位域。所以102 是它的正常值,因为它在byte 值的范围内(即[0;255])。如果您想操作这些位,请考虑使用BitArrayBitVector32

【讨论】:

    【解决方案3】:

    我如何通过提供位来设置字节值?

    如果您要显式设置字节值,则可以使用前缀0x 来表示您正在以十六进制进行设置,作为 4 位组的编码。例如。十进制102的十六进制值为0x66,相当于0110 0110

    但为了直接提供位,Marc Gravell 提供了一个选项 here 用于使用 Convert 类从二进制转换为 int,类似地,您可以使用 Convert.ToByte method 将二进制值的字符串表示形式转换为字节,如下所示:

    byte b = Convert.ToByte("01100110", 2);

    【讨论】:

    • 不错的解决方案,我不知道 ToByte
    • 根据MSDN,“存在一种将每种基本类型转换为其他所有基本类型的转换方法。”但并非所有转换都受支持,并且某些尝试会引发异常。
    猜你喜欢
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2022-12-11
    • 1970-01-01
    • 2021-04-19
    • 2017-11-03
    • 1970-01-01
    相关资源
    最近更新 更多