今天碰到了负数除法与右移的替代问题,借机研究一下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的取整就是采用这种方法。

但是,在ARM的NEON运算里的rounding,以及java的Math.round()函数的返回值来看(参考http://www.cnblogs.com/jiutianhe/archive/2012/10/07/2755655.html):

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

-5 / 4 = -1;

-6 / 4 = -1;

-7 / 4 = -2;

c语言二进制负数的除法,C语言中负数除法与右移取整问题相关推荐

  1. python中的除法运算_python中矩阵除法运算的三种实现方法

    介绍过python矩阵的乘法运算,numpy库中虽然乘法是矩阵运算的主要运算,但是numpy作为python中实现矩阵运算的好工具,也是可以轻松实现除法计算的,本文python中矩阵除法的三种实现方法 ...

  2. [深入浅出C语言]理解取整、取余和取模

    关于C语言的取模运算,也许你只了解正数取模,而从未接触过负数取模,本文就来分享一波C语言取整.取模和取余的个人学习经验与心得,希望对你有所帮助. 笔者水平有限,难免存在纰漏,欢迎指正交流. 关于取整 ...

  3. c语言中的除法求商例题,二进制除法商怎么计算?101001000除以1101怎么求商,求步骤...

    二进制除法商怎么计算?101001000除以1101怎么求商,求步骤 答案:3  信息版本:手机版 解决时间 2019-01-08 17:35 已解决 2019-01-07 23:30 二进制除法商怎 ...

  4. 为什么python除法结果会有小数点0_关于python:为什么整数除法会在许多脚本语言中向下取整?...

    在我测试过的语言中,- (x div y )不等于-x div y: 我已经在Python中测试了//,在Ruby中测试了/,在Perl 6中测试了div: C具有类似的行为. 该行为通常是按照规范进 ...

  5. python中的除法、取整和求模_python中的除法,取整和求模-Go语言中文社区

    首先注明:如果没有特别说明,以下内容都是基于python 3.4的. 先说核心要点: 1. /是精确除法,//是向下取整除法,%是求模 2. %求模是基于向下取整除法规则的 3. 四舍五入取整roun ...

  6. C语言存储为2进制,浮点数的二进制存储形式及c语言验证

    我们经常听说浮点数,其实浮点数是和定点数对应的.定点数就是小数点固定的数,而且他的小数点在最右边,所以定点数用来表示整数. 浮点数表示方法允许小数点的浮动,一个浮点数分为三个部分:第一部分是符号,可以 ...

  7. c语言中负数_C语言中负数的模数

    c语言中负数 C中的模数运算符(%)运算符 (The modulus operator (%) operator in C) The modulus operator is an arithmetic ...

  8. C语言中四种取整方式、取余/取模的运算以及负数取模的问题

    零向取整.负无穷向取整.正无穷向取整.四舍五入取整 如果将一个浮点数赋值给整形,只会保存整数位: 这种取整方式为零向取整,C语言默认采用的是这种方式 C语言中也有对应的零向取整函数: 同理还有一种函数 ...

  9. C 语言中负数移位运算讲解

    C 语言中负数移位运算讲解 "<<".">>"为移位运算符. "<<"为左移位运算符,即数据字节中的每个 ...

最新文章

  1. App is not indexable by Google Search; consider adding at least one Activity with an ACTION-VIEW int
  2. R语言使用pwr包的pwr.t.test函数对分组样本数相同的t检验进行效用分析(power analysis)、在已知效应量(effect size)、显著性水平、效用值的情况下计算需要的样本量
  3. matlab 定义string_MATLAB开发自动驾驶第十课-创建用于加载自定义地面真值数据源的类...
  4. 【代码审计】使用SonarQube进行代码质量分析管理
  5. boost::endian::detail::is_scoped_enum用法的测试程序
  6. OpenGL几何着色器
  7. 【Filecoin源码仓库全解析】第一章:搭建Filecoin测试节点
  8. WEB平台架构之:LAMP(Linux+Apache+MySQL+PHP)
  9. LeetCode-25:K 个一组翻转链表
  10. 【BZOJ3956】Count,单调栈+ST表维护区间最大值
  11. 生态功能区划方法之三:聚类分析法和生态融合法
  12. jdk版本修改不生效
  13. SSH 无法远程登录问题的处理思路
  14. 精通CSS:高级Web标准解决方案(第2版)--前言
  15. 【C语言】C语言小项目—贪吃蛇
  16. 美国新泽西州,也有一个Menlo Park——门洛公园,尽管不太为人熟知,但爱迪生那里的一个发明却点亮了全世界。...
  17. 远程 交换机 日志服务器,交换机怎么配置 日志发送日志服务器
  18. 2022-04-24 表单设计器动态插入脚本【低代码平台】
  19. Java编程——subString,截取当前字符串的部分内容
  20. Linux搭建Java部署环境

热门文章

  1. js对象排序,根据对象的key来排序,按ASCII码排序
  2. DirectX11 输入设备——DirectInput检测鼠标、键盘状态
  3. 一个自己开发的并应用在很多项目里的unity关卡编辑器
  4. VUE3使用JSON编辑器
  5. 演讲稿 ―― 一生有你
  6. windows10桌面小箭头去掉后任务栏用不了
  7. iPhone手机连接WAPI调试方法和经验总结
  8. 小程序跳转url地址实现
  9. Linux多线程 | 线程同步
  10. 使用dex2jar + XJad 方法反编译 Android APK