【问题标题】:How do add 1 to a byte怎么给一个字节加1
【发布时间】:2011-07-10 20:58:19
【问题描述】:

我试过了

 module Program
 {
  Main() : void
  { mutable x : byte = 0B;
    mutable y : byte = 0B;  
    x++;
    //y = x + 1;
    //y = x + 1B;
    //def one:byte=1;//   x = x + one;
  }
 }

无论我尝试哪一个,我都会收到以下错误消息。

错误 1 ​​个预期字节,在分配的值中获得 int:System.Int32 不是 System.Byte [简单要求]的子类型

我发现唯一可行的方法是

    y = ( x + 1 ):>byte

这有点花里胡哨,只是添加一个。

这是为什么?还有更好的(阅读更短的方法)吗?

【问题讨论】:

  • 我不使用 nermerle,但这听起来像是一个“类型扩大”问题——byte + int 的返回类型是什么? byte + byte 呢? C# 类似:byte x = 0; x = x + 1 也不会编译。 (C# 实际上可以与 x += 1x++ 一起使用,但可能会在 nemerle 中扩展它们。)
  • byte + int = int(int 是主要类型)。 byte + byte 是 int 的意外返回类型

标签: .net nemerle


【解决方案1】:

与在 C# 中一样,byte 和 Nemerle 中的 byte 之和的结果是 int。然而,与 C# 不同的是,Nemerle 试图使核心语言尽可能紧凑,将所有语法糖保留在标准宏库中。本着这种精神,+=++ 运算符是被翻译成常规加法的宏。

要回答您的问题,(x + 1) :> byte 就是这样做的方法。其实也不是很糟糕,因为它让你的代码的读者知道你意识到溢出的危险并为此负责。

不过,如果您对此有强烈的感觉,您可以轻松编写自己的 +=++ 宏来执行转换。只需要几行代码。

【讨论】:

    【解决方案2】:

    这是因为 CLR 只为 Add IL 指令定义了有限数量的有效操作数。有效的是 Int32、Int64、Single 和 Double。还有 IntPtr,但在许多语言中往往会被禁用。

    因此向字节添加常量需要先将字节转换为 Int32。添加的结果是一个 Int32。这不适合回到一个字节。除非你用更大的锤子。这在其他方面是健康的,溢出 Byte.MaxValue 的可能性非常大。

    请注意,有些语言会自动转换,VB.NET 就是其中之一。但它也会自动生成一个溢出异常。显然不是您正在使用的那个,也不是 C#。这是一个 perf 的选择,溢出测试并不便宜。

    【讨论】:

    • y = if(x<255){x + 1}else{255}; 写起来并不难。因此,C# 隐式地将一个字节转换为 int(秘密地),这有点违反精神类型的安全性。你会认为你可以在没有强制转换的情况下使用“基本”类型进行简单的添加。
    • 所有语言加宽字节。他们必须这样做,没有加法运算符需要一个字节。这是我回答的关键。你的解决方法是有问题的,我会抛出 OverflowException 但会忍受 0. 255 没有意义。
    • 如果您想要有界值,则不要。
    • 这只是“bug”的一个漂亮的名字。 CLR 设计者不可能承诺那种行为。不添加任何内容的 Add 是一连串的错误报告。您可以自己注入行为。
    【解决方案3】:

    免责声明:我不了解 Nemerle,但我假设它在这方面的行为类似于 C#。

    有一个更好更短的方法:不要使用字节。

    你为什么首先使用它们?大多数时候,使用ints 的计算比使用bytes 更快,因为今天的计算机已经针对它们进行了优化。

    【讨论】:

    • 你能解释一下为什么基于 int 的计算比基于 byte 的更快吗?
    • @svick Doh!我永远不会想到这一点。 (讽刺)。我正在使用字节。您可以在 C# 中将 1 添加到字节并且它可以工作,为什么不 Nemerle?
    • @Adam,你不能在 C# 中这样做。
    • 找到了与硬件没有联系的开发者。当你有一个硬件接口需要这样的东西时,处理字节和东西就变得很重要了。
    【解决方案4】:

    这就是类型系统所做的。加法将值升级到 int,然后执行生成 int 的操作。也想过如果起始值为 255 会发生什么?

    【讨论】:

    • 我会考虑到这一点,我将代码精简到复制症状所需的最低限度。
    • 那么为什么它 x++ 有效?为什么它将它转换回一个字节?
    • VB.Net 有效字节添加。 Option Strict On Option Explicit On Module Module1 Sub Main() Dim x As Byte = 1 Dim y As Byte = 0 Dim o As Byte = 1 y = x + o End Sub End Module .
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 2011-09-26
    • 2010-12-05
    • 2020-01-17
    相关资源
    最近更新 更多