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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java英文参考文献最新_外文文献网站

    java英文参考文献最新_外文文献网站javaspring英文文献和中文翻译时间:2019-08-2920:46来源:毕业论文SpringinpracticeSpringwasoriginallyconceivedasawaytosimplifyJavaEnterpriseEdition(JEE)evelopment,butitsnotexactlyasimpleframework….

    2022年9月29日
    1
  • 浅谈插头dp

    浅谈插头dp毒瘤瘤的插头dp

    2022年7月1日
    22
  • PANDAs_pandas去除缺失值

    PANDAs_pandas去除缺失值该函数主要用于滤除缺失数据。如果是Series,则返回一个仅含非空数据和索引值的Series,默认丢弃含有缺失值的行。xx.dropna()对于DataFrame:data.dropna(how=’all’)#传入这个参数后将只丢弃全为缺失值的那些行data.dropna(axis=1)#丢弃有缺失值的列(一般不会这么做,这样会删掉一个特征)data…

    2026年1月20日
    3
  • 5.6 读和写流

    5.6 读和写流

    2021年8月14日
    51
  • 联想笔记本键盘亮屏幕不亮_笔记本电脑进入睡眠状态后无法通过鼠标或键盘来唤醒屏幕怎么解决…「建议收藏」

    联想笔记本键盘亮屏幕不亮_笔记本电脑进入睡眠状态后无法通过鼠标或键盘来唤醒屏幕怎么解决…「建议收藏」‍通常情况下,我们如果有一段时间没有使用笔记本电脑,那么笔记本会自动进入睡眠状态。有用户发现笔记本电脑进入睡眠状态后无法通过鼠标或键盘来唤醒屏幕,那么应该怎么解决这个问题呢?大家可以参考下面提供的方法看看能否解决。1、如果遇到睡眠不能唤醒的问题,可以点击笔记本上的电源按钮,有的机型是通过点击电源按钮来唤醒的;2、如果点开机键还是不能解决,可以查看硬盘指示灯,在睡眠状态下,硬盘灯是闪烁的;3、如果硬…

    2025年11月26日
    4
  • 查看已安装tensorflow版本

    查看已安装tensorflow版本由于tensorflow版本不同,可能一些函数的调用也有变换,这时候可能需要查看tensorflow版本,可以在终端输入查询命令如下:pythonimporttensorflowastftf.__version__查询tensorflow安装路径为:tf.__path__查询结果如下:

    2022年6月25日
    29

发表回复

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

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