Jiffies Counter Over Flow案例+ Linux

Joy*_*Joy 2 linux math counter integer-overflow

Jiffies计数器返回一个大小为四字节的无符号整数.当计数器达到最大值时,它再次从0重新开始.我将用旧值减去最新值以获得持续时间.那么我应该如何考虑这样一种情况:当旧值具有最大值并且新值大于零时,我将得到错误的持续时间?

Did*_*set 6

您不必执行任何操作,您将拥有正确的持续时间(只要您使用四个字节的无符号整数进行所有计算).这是实现为固定宽度二进制算术的整数值的神奇之处.

这是一个8位无符号整数的例子.你甚至可以看到,即使有溢出,差异仍然有效.

236 - 221 = 11101100 - 11011101 = 11101100 + 00100011 = 00001111 = 15
251 - 236 = 11111011 - 11101100 = 11111011 + 00010100 = 00001111 = 15
 10 - 251 = 00001010 - 11111011 = 00001010 + 00000101 = 00001111 = 15
 25 -  10 = 00011001 - 00001010 = 00011001 + 11110110 = 00001111 = 15
   ...
Run Code Online (Sandbox Code Playgroud)

当持续时间与计数器的最大值相比不小时,即当它可能大于最大值的一半时,就会出现单个问题.