我试图检查收到的消息号是否在给定范围内.每次消息号增加时.如果我期待数字10,我接受任何号码为10+的消息.所以序列号为10到15.我使用的是unsigned int.因此,当预期数量为65532时,我可以接受65532 + 10(所以min = 65532和max = 5).如何检查我收到的号码是否在此范围内?
简单地减去
unsigned message_number, expected_number;
unsigned range = 5; // or 10, OP’s post varies as to the desired range.
if ((message_number - expected_number) <= range) {
; // accept;
}
Run Code Online (Sandbox Code Playgroud)
无符号算术的环绕定义很明确.
[编辑]
如果message_number在同一个地方缠绕,上述解决方案效果很好unsigned.以下解决方案没有做出这样的假设,也没有假设message_number包含在unsigned short.
unsigned maxsequenceplus1_number = 65536LU;
if (((message_number - expected_number)%maxsequenceplus1_number) <= range) {
; // accept;
}
const unsigned maxsequence_number = 65535U; // some power of 2 minus 1
if (((message_number - expected_number)&maxsequence_number) <= range) {
; // accept;
}
Run Code Online (Sandbox Code Playgroud)