c语言中负数参与除法,C语言中负数除法与右移取整问题

今天碰到了负数除法与右移的替代问题,借机研究一下C语言中负数除法的问题。此处只讨论整数除2的幂次方的情况,并取-7~-5除以4为例,不讨论一般除法的移位优化。

1.     负数右移

对于有符号整数,右移时按高位补符号位的原则,则结果会向小于它的整数取整。如

-5 >> 2 = -2;

-6 >> 2 = -2;

-7 >> 2 = -2;

2.     负数除法(截断)

博文《议“右移一位 等同于 除以二”》http://blog.chinaunix.net/uid-406135-id-3421605.html中有这样一段描述:“C99和C++0x规定,商向零靠近取整,在C99和C++0x之前,只保证商*除数+余数==被除数,如果希望商向零靠近取整,应当使用div函数。”

那上述算式就会有结果:

-5 / 4 = -1;

-6 / 4 = -1;

-7 / 4 = -1;

3.     负数除法(四舍五入)

四舍五入的意义就在于向临近的整数取整,但问题就在于对.5这个临界点如何进行处理。这里有一种说法,即是说对于负数相除四舍五入的情况,可以先将符号拿掉,按正整数做除法,最后再把符号位加到结果上即可。那上述算式的结果应该为:

-5 / 4 = -1;

-6 / 4 = -2;

-7 / 4 = -2;

sign(val) * (abs(val) +(1<< (n-1) )>> n)。

Microsoft Excel的取整就是采用这种方法。

在.5这个临界点上,对于正负值都是向上取整。即是说按公式(val+ (1 << (n-1))) >> n进行计算。即:

-5 / 4 = -1;

-6 / 4 = -1;

-7 / 4 = -2;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值