1.关于u32,计算公式如下;
u32 u32_a, u32_b, u32_diff;
u32 u32_max = 0xFFFFFFFF;
u32_diff = (u32_b > u32_a) ? (u32_b - u32_a) : (u32_max - u32_a + 1 + u32_b);// u32_diff = u32_b - u32_a; is OK;
2.u32 u32_a, u32_b;
u32 u32_diff = u32_b - u32_a;
u16 u16_diff = u32_diff / 1000;
u16 u16_a = u32_a / 1000;
u16 u16_b = u32_b / 1000;
u16 u16_diff0 = u16_b - u16_a;
if (u16_diff0 == u16_diff)
printf("OK\n");
else
printf("ERROR\n");
结果输出:ERROR;
分析:为快速分析,将1000看作1024;
1)如果u32_b > u32_a,如果第25位(不包括第25位)往上有不同,则会有数值丢失;否则是相等的。
2)如果u32_b == u32_a,二者相等;
3)如果u32_b < u32_a,抛开差值巨大的情况;结果为(u32_max - u32_a + 1 + u32_b) / 1024
而u16_diff0结果为(u16_max - u16_a + 1 + u16_b) 结果未必相等;
示例如下:u32_a = 4294909919 = 0xFFFF1FDF;u32_b = 342594 = 0x53A42;
u16_diff = u32_diff / 1024 = 0x61A63 / 1024 = 0x186;
u16_a = u32_a / 1024 = 0xFFC7;
u16_b = u32_b / 1024 = 0x14E;
u16_diff0 = 0x187
示例如下:u32_a = 4294909919 = 0xFFFF1FDF;u32_b = 342594 = 0x53A42;
u16_diff = u32_diff / 1000 = 0x61A63 / 1000 = 399.971 = 399;
u16_a = u32_a / 1000 = 4294909.919 = 4294909(0x4188FD) = 35069(0x88FD);
u16_b = u32_b / 1000 = 342(0x156);
u16_diff0 = 30809(0x7859)
有上面两个计算,可以看到,如果两个数同时右移相同位数,两种算法区别不大;但如果除以一个非2的整数幂,则就会造成计算错误;
经验,在时间计算上,时间点均用相同的单位,比如us或者ms;时间长度计算时,通过差值计算,差值单位可以转换为ms或者s。