添加到字节而不溢出
Add To Bytes without overflow
对于某些 API 集成,我有一个操作需要添加两个字节并得到一个字节作为结果。这是某种校验和。现在自然会发生溢出。
例如
byte a = 0xff
byte b = 0x01
byte results = a + b;
是否有简单的内置语法来避免溢出以继续处理下一个字节,还是我必须自己执行此操作?例如减去完整字节等等?
没有找到 API,我是不是忽略了什么?
默认情况下,C# 不检查整数溢出,所以这应该可以正常工作。
但是,如果项目启用了整体溢出检查,您可以使用 unchecked
关键字为代码块抑制它,例如:
byte a = 0xff
byte b = 0x01
unchecked
{
byte results = (byte) a + b;
}
或者
byte results = (byte) unchecked(a + b);
当您添加 byte
时,结果是 int
,例如
byte a = 100;
byte b = 200;
var result = a + b; // result == 300
由于 a
和 b
都在 0..255
范围内,结果将在 0..510
范围内并且 不可能出现整数溢出。但是你想要 byte result
这就是你需要演员表的原因:
byte result = (byte) (a + b);
这里.net可以显示两种种反应:
- check ans throw overflow exception
- 不检查并忽略溢出:
256 -> 0
、257 -> 1
等
我们想要第二个选项,这就是为什么 unchecked
:
byte result = unchecked((byte) (a + b));
对于某些 API 集成,我有一个操作需要添加两个字节并得到一个字节作为结果。这是某种校验和。现在自然会发生溢出。
例如
byte a = 0xff
byte b = 0x01
byte results = a + b;
是否有简单的内置语法来避免溢出以继续处理下一个字节,还是我必须自己执行此操作?例如减去完整字节等等? 没有找到 API,我是不是忽略了什么?
默认情况下,C# 不检查整数溢出,所以这应该可以正常工作。
但是,如果项目启用了整体溢出检查,您可以使用 unchecked
关键字为代码块抑制它,例如:
byte a = 0xff
byte b = 0x01
unchecked
{
byte results = (byte) a + b;
}
或者
byte results = (byte) unchecked(a + b);
当您添加 byte
时,结果是 int
,例如
byte a = 100;
byte b = 200;
var result = a + b; // result == 300
由于 a
和 b
都在 0..255
范围内,结果将在 0..510
范围内并且 不可能出现整数溢出。但是你想要 byte result
这就是你需要演员表的原因:
byte result = (byte) (a + b);
这里.net可以显示两种种反应:
- check ans throw overflow exception
- 不检查并忽略溢出:
256 -> 0
、257 -> 1
等
我们想要第二个选项,这就是为什么 unchecked
:
byte result = unchecked((byte) (a + b));