检查数字是否在范围内时,使用unsigned int进行翻转问题

dm2*_*m25 3 c c++

我试图检查收到的消息号是否在给定范围内.每次消息号增加时.如果我期待数字10,我接受任何号码为10+的消息.所以序列号为10到15.我使用的是unsigned int.因此,当预期数量为65532时,我可以接受65532 + 10(所以min = 65532和max = 5).如何检查我收到的号码是否在此范围内?

chu*_*ica 6

简单地减去

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)

  • 从某种意义上说,你正在做无符号的算术柔道:你正在使用自己的能量来对付它. (3认同)