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

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

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

  1. 负数右移
    

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

-5 >> 2 = -2;

-6 >> 2 = -2;

-7 >> 2 = -2;

  1. 负数除法(截断)
    

博文《议“右移一位 等同于 除以二”》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;

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

四舍五入的意义就在于向临近的整数取整,但问题就在于对.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语言如何进行取整

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114935.html原文链接:https://javaforall.net

(0)
上一篇 2021年9月27日 上午7:00
下一篇 2021年9月27日 上午8:00


相关推荐

  • java心形代码初学者_java输出爱心代码

    java心形代码初学者_java输出爱心代码绘制心形曲线1.要求非常有名的笛卡尔曲线数学公式:(x2+y2−2ax)2=4a2(x2+y2)(x^{2}+y^{2}-2ax)^{2}=4a^{2}(x^{2}+y^{2})(x2+y2−2ax)2=4a2(x2+y2)即心形曲线,本例通过Applet绘制出笛卡尔曲线。2.实现过程笛卡尔曲线是一个圆在同样半径的圆周上滚动,在滚动的过程中一定会形成轨迹曲线。它的数学方程为x=a(2c…

    2022年10月16日
    3
  • python面向对象编程指南 pdf_python面向对象的三个基本特征

    python面向对象编程指南 pdf_python面向对象的三个基本特征虽然Python是解释性语言,但是它是面向对象的,能够进行对象编程。下面就来了解一下如何在Python中进行对象编程。一.如何定义一个类  在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法。  类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义:

    2025年6月24日
    5
  • Qwen3-Max参数规模超万亿,多项基准测试达SOTA,预告推理增强版本达奥数竞赛满分水平

    Qwen3-Max参数规模超万亿,多项基准测试达SOTA,预告推理增强版本达奥数竞赛满分水平

    2026年3月13日
    1
  • 批处理的注释:批处理程序中的多行注释方法

    批处理的注释:批处理程序中的多行注释方法在批处理中 段注释 多行注释 有一种比较常用的方法 即使用 goto 跳过 gotostart 可以是多行文本 可以是命令 可以包含重定向符号和其他特殊字符 只要不包含 start 这一行 就都是注释 start 其他各种注释形式有如 1 注释内容 第一个冒号后也可以跟任何一个非字母数字的字符 2 rem 注释内容 不能出现重定向符号和管道符号 3 echo 注释内

    2026年3月18日
    2
  • wrk压力测试使用心得(详细)

    wrk压力测试使用心得(详细)wrk 是一种现代 HTTP 基准测试工具 能够在单个多核 CPU 上运行时产生大量负载 它结合了多线程设计和可扩展的事件通知系统 如 epoll 和 kqueue 以及使用了 redis 的 ae 事件循环 可以用很少的线程压出很大的并发量 一 wrk 下载和安装可以从 github 上下载 wrk 源码 如果没有 git 可以百度安装一下 1 window 系统打开 git 窗口 在目录中使用此命令下载 wrk 如果服务器

    2026年3月26日
    2
  • python suds_在python3.x上安装suds 并访问webservice「建议收藏」

    python suds_在python3.x上安装suds 并访问webservice「建议收藏」suds。。。py3很乱。。一开始直接使用命令行:pipinstallsuds安装,结果报错ImportError:Nomodulenamedclient,然后就自然的pipinstallclient,然后成功了,pipinstallsuds安装,这下成功安装了。但是在python里虽然能importsuds。。但不能fromsuds.clientimportClien…

    2025年5月31日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号