无符号数值越界处理

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值