精华内容
下载资源
问答
  • C语言与Python负数除法求值间的差异一直用Python做计算器用(有点大材小用了啊,呵呵)。今天使用时,却发现一个诡异的现象,在C语言入门经典(第4版)说正负数除数取余操作的差别,就在Python上试验了一下,结果结成...

    类C语言与Python负数除法求值间的差异

    一直用Python做计算器用(有点大材小用了啊,呵呵)。今天使用时,却发现一个诡异的现象,在C语言入门经典(第4版)说正负数除数取余操作的差别,就在Python上试验了一下,结果结成了完全不一样。下面列出三种语言做同样运算的差别(外加上Java)。

    Java:

    Java代码

    1227352897.png

    import

    java.lang.*;

    public

    class

    divmod

    {

    public

    static

    void

    main(String[] args)

    {

    System.out.println("45/-7="

    +(

    45

    /-

    7

    ));

    System.out.println("45%-7="

    +(

    45

    %-

    7

    ));

    System.out.println("-45/7="

    +(-

    45

    /

    7

    ));

    System.out.println("-45%7="

    +(-

    45

    %

    7

    ));

    }

    }

    结果是:

    C:\Documents and Settings\g1309288>cd /d D:\javapro

    D:\JavaPro>javac divmod.java

    D:\JavaPro>java divmod

    45/-7=-6

    45%-7=3

    -45/7=-6

    -45%7=-3

    C:

    C代码

    1227352897.png

    #include 

    main()

    {

    printf("45/-7=%2d\n"

    ,45/-7);

    printf("45%%-7=%2d\n"

    ,45%-7);

    printf("-45/7=%2d\n"

    ,-45/7);

    printf("-45%%7=%2d\n"

    ,-45%7);

    }

    结果是:

    45/-7=-6

    45%-7= 3

    -45/7=-6

    -45%7=-3

    Python:

    Python代码

    1227352897.png

    print

    (

    "45/-7="

    ,

    45

    /-

    7

    );

    print

    (

    "divmod(45,-7)="

    ,divmod(

    45

    ,-

    7

    ));

    print

    (

    "45%-7="

    ,

    45

    %-

    7

    );

    print

    (

    "-45/7="

    ,-

    45

    /

    7

    );

    print

    (

    "divmod(-45,7)="

    ,divmod(-

    45

    ,

    7

    ));

    print

    (

    "-45%7="

    ,-

    45

    %

    7

    );

    结果是:

    C:\Documents and Settings\g1309288\桌面>divmod.py

    45/-7= -6.428571428571429

    divmod(45,-7)= (-7, -4)

    45%-7= -4

    -45/7= -6.428571428571429

    divmod(-45,7)= (-7, 4)

    -45%7= 4

    可以看到当有负数存在时,C语言和Python运算的结果是不一样的。C语言不管正负,结果的绝对值是相等的,而Python却不一样。

    基于上面的结果,有一个假设,Python取余运算所取的商数是不大于实际商的最大整数。即divmod(-45,7)==(math.floor(-45/7),-45%7)。

    展开全文
  • 今天碰到了负数除法与右移的替代问题,借机研究一下C语言负数除法的问题。此处只讨论整数除2的幂次方的情况,并取-7~-5除以4为例,不讨论一般除法的移位优化。 负数右移 对于有符号整数,右移时按高位补符号...

    今天碰到了负数除法与右移的替代问题,借机研究一下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语言如何进行取整

    展开全文
  • C语言负数整形的除法和取余

    千次阅读 2019-07-10 09:32:45
    C语言整形的除法的结果需要取整,例如5 / 3 = 1。C语言中的取整方式是向零取整。 取整风格共有3种: 向零取整。即向坐标轴0的方向,取最近的整数。 向上取整。也就是向+∞取整,即取不小于结果的最小整数。 向下...

    C语言整形的除法的结果需要取整,例如5 / 3 = 1。C语言中的取整方式是向零取整。

    取整风格共有3种:

    1. 向零取整。即向坐标轴0的方向,取最近的整数。
    2. 向上取整。也就是向+∞取整,即取不小于结果的最小整数。
    3. 向下取整。也就是向-∞取整,即取不大于结果的最大整数。

    所以,C语言中计算-5除以3,因为实数结果约为-1.67,向零取整,得到结果为-1。

    关于除法,人们常常用向右移位的方式来快速计算一个数除以2的幂的结果,例如16 / 4 = 4就是把10000右移2位得到100,即4;9 / 4 = 2就是把1001右移2位得到2。事实上,这种快速计算的方法,是一种向下取整的过程,所以它只适用于被除数为正数的情况。若被除数为负数,这种右移的快速计算方式就是错误的了。下面用代码来验证一下,从10到-10,分别计算他们除以4和右移2位的结果:

    #include <stdio.h>
    
    int main()
    {
      int i = 0;
    
      for (i = 10; i >= -10; i--)
      {
        printf("%d / 4 = %d\r\n", i, i / 4);
        printf("%d >> 2 = %d\r\n", i, i >> 2);
        printf("\r\n");
      }
    
      getchar();
        
      return 0;
    }

    程序运算结果如下图所示:

    可见,当被除数为正数的时候,除以4和右移2位的结果是一样的。但是,当被除数为负数的时候,这两个结果并不一定相同。

    关于负数的右移操作的解释:以-6为例,6的二进制形式是110,所以-6的补码形式是第一位符号位为1,数据位是110取反加1,得到1010。1010右移2位,得到10。取出10的符号位1,数据位是0,数据位取反加1得到10,即十进制的2。也就是十进制-6右移2位得到十进制的-2。

    有了除法的基础,取余(也叫求模)操作根据公式计算就可以了。设A除以B的结果为Q,余数为R,则A = B * Q + R, R = A - B *Q。例如求-8 % 3,因为-8 / 3 = -2,那么余数就是-8 - 3 * (-2) = -2

    取余操作除了套用公式来做,还有一个快捷的经验,就是取余的结果的符号永远和被除数的符号一样。这个经验可以用下面的例子来解释:去银行借了8万块贷款,每个月还3万,还了2个月之后,还剩下2万没还,这个2万依然是欠的,所以和8万的符号相同。

    展开全文
  • C语言除法与取余运算

    千次阅读 2019-10-03 11:25:43
    C语言中,负数除法运算与正数除法运算不一样,遵循原则有: a/b分子分母的符号,相同为正,相异为负 a%b结果取分子(a)的符号,即与被除数(a)符号相同 eg:-3/16=0;16/-3=-5; -3%16=-3;16%-3=1; 在数学公式中,...

    在C语言中,负数除法运算与正数除法运算不一样,遵循原则有:

    a/b      分子分母的符号,相同为正,相异为负

    a%b     结果取分子(a)的符号,即与被除数(a)符号相同


    eg :       -3/16 = 0 ;       16/-3 = -5;

                 -3%16 = -3 ;     16%-3 = 1;




    在数学公式中,c语言和Python的表示算法都是一样的:
           
    r=a-n*[a/n]

    以上,r是余数,a是被除数,n是除数。

    唯一不同点,就是商向0或负无穷方向取整的选择:

    c从c99开始规定向0取整
    python则规定向负无穷取整

    向零取值的含义是:
    9/7=1 .29 ----向0取值--> 1
    -9/7=-1.29----向0取值--> -1

    向负无穷取值的含义是:
    9/7=1 .2 9----向0取值--> 1
    -9/7=-1.29----向0取值--> -2

    所以套用上述公式为:

    C 语言:(a%n的符号与a相同)

                -9%7=-9 - 7*[-1]= -2;

                9%-7=9 - -7*[-1]= 2;

    Python :(a%n的符号与n相同)

                -9%7=-9 - 7*[-2]= 5

                9%-7=-9 - -7*[-2]= -5

    展开全文
  • 负数除法和取模运算

    千次阅读 2017-08-31 15:17:23
    c语言负数除法取模
  • C语言中带负数除法

    千次阅读 2019-01-04 15:04:18
    首先先说余数,在C语言中余数的符号是和被除数的符号相同。...做除法的时候,商是令其与分母相乘的积的绝对值不超过分子的绝对值且最接近的那个数, 所以 (-10)/3==-3; 10/(-3)==-3; (-10)/(-3)==3; 余数与被除数...
  • 今天使用时,却发现一个诡异的现象,在C语言入门经典(第4版)说正负数除数取余操作的差别,就在Python上试验了一下,结果结成了完全不一样。下面列出三种语言做同样运算的差别(外加上Java)。 Java: Java...
  • 负数除法与正数除法原理

    千次阅读 2015-07-26 17:58:08
    C语言中,负数除法运算与正数除法运算不一样,遵循原则有: (/)除号的正负取舍和一般的算数一样,符号相同为正,相异为负 (%)求余符号的正负取舍和被除数符号相同 -3/16 = 0 ; 16/-3 = -5; -3%...
  • 例如 -3 / 2 = -1; -3 % 2 = -1;  3 / (-2) = -1;... 做ZM的一道题时,正好碰到 6+-2/3 是否= 5的题,联想到余数正负的问题,发现直接从除法的商思考最简单。 3/2 = 1,无论除数还是被除数是负,商即为负
  • C语言整形的除法的结果需要取整,例如5 / 3 = 1。C语言中的取整方式是向零取整。 取整风格共有3种: 向零取整。即向坐标轴0的方向,取最近的整数。 向上取整。也就是向+∞取整,即取不小于结果的最小整数。 向下...
  • 除法运算: 当操作数为整数时,结果也是整数,操作数含负数不影响结果的符号。 取模运算 其结果符号总是与左操作数的符号相同。 45%-7=-3; -45%7=3;
  • C语言有以下几种取整方法:1、直接赋值给整数变量。如:int i = 2.5;...整数除法对正数的取整是舍去小数部分,但是整数除法负数的取整结果和使用的C编译器有关。3、使用floor函数,向下取整。f...
  • 关于负数求模运算到底怎么求最近有同事问到,负数到底怎么求模,结果的符号是和除数、被数哪一个相关。因为这个问题好像以前也纠结过,但一直没有整理记录,因此特地搜索了相关资料,同时求证了在Java中求模运算的...
  • 负数的表示方法总结:////////////////////////////////////////////////////////////////////...负数的补码为对该数的原码符号位外各位取反,然后在最后一位加1下面是书上原文:原码表示规定:用符号位和数值表...
  • 使用移位很容易把符号位变换了,而乘法不会。 比如a=0b1011 1110,就是-66。...a=0b0111 1100=124,负数变正数了,符号位被移走了。 而实际上a*2=-132。所以用移位代替乘法时一定要注意符号位 ...
  • x=-3*4%-6/5为什么等于0 ? 此题考的知识点事算术运算符的计算。,%,/ 的优先级一样,结合为...C语言计算负数取余:符号内的被数决定,就是计算式中的-7,7,-7决定:比如-7%5=-2; 7%-5=2; -7%-5=-2; 负数取余的...
  • C语言取整

    2020-05-29 16:28:13
    C语言有以下几种取整方法: 1、直接赋值给整数变量。...整数除法对正数的取整是舍去小数部分,但是整数除法负数的取整结果和使用的C编译器有关。 3、使用floor函数。 floor(x)返回的是x的整数部分。如: &
  • 这种方法采用的是舍去小数部分2、C/C++中的整数除法运算符“/”本身就有取整功能(int / int),但是整数除法负数的取整结果和使用的C编译器有关。3、使用floor函数。floor(x)返回的是小于或等于x的最大整数。如:...
  • C语言运算符总结

    2019-08-19 22:30:51
    c语言中的除法,与我们数学中的除法是有差异的。例如5/3=?,在数学中,5÷3=1.666……,而在c语言中,5/3=1,舍去了小数部分。在c语言中,两个实数相除的结果是双精度实数,两个整数相除的结果是整数。当两个数相除...
  • C语言取整方法

    千次阅读 2018-07-25 15:48:11
    C语言取整方法 1. 直接赋值给整数变量 ... ‘ / ’本身就有取整功能(int / int),可是整数除法负数的取整结果和使用的C编译器有关。 3、使用floor函数  floor(x)返回的是小于或等于x的最大整数。 如...
  • /是精确除法,//是向下取整除法; print('123 / 10 = ', 123 / 10) print('123 // 10 = ', 123 // 10) 对于负数还有需要注意的地方: Python3中, 在c语言中,-53除以10=-5 %是求模,...
  • c语言小问题

    2014-04-17 22:20:01
    C语言有以下几种取整方法: ... 2、C/C++中的整数除法运算符“/”本身就有取整功能(int / int),但是整数除法负数的取整结果和使用的C编译器有关。 3、使用floor函数。floor(x)返回的是小于或等于x的最大整数。
  • C语言取整函数

    2019-11-16 17:05:48
    1、直接赋值给整数变量。如: int i = 2.5; 或 i = (int) 2.5;...整数除法对正数的取整是舍去小数部分,但是整数除法负数的取整结果和使用的C编译器有关。 3、使用floor函数,向下取整。floor(x)返回的是x...
  • c语言工程训练 课程设计题目教小学生算数 学生学号: 学生姓名: 指导教师: 需求分析 通过此系统实现以下功能 做个位数十位数的加减乘和除减法不能得负数除法要除尽屏幕上随机出 现两个数提示小学生给出答案答错了要...
  • * (乘法运算符) 4./ (除法运算符) 5(求余运算符) 注意 加法和减法运算符同于数学上 乘法在c语言中用*而不用 除法c语言中是/而不用 使用/时若除数和被除数都为整数则商也是整数若参与运算的有负数 3.3.2算术表达式...
  • c语言中小数取整

    万次阅读 2017-09-05 10:41:10
    2、C/C++中的整数除法运算符“/”本身就有取整功能(int / int),但是整数除法负数的取整结果和使用的C编译器有关。 3、floor函数。floor(x)返回的是小于或等于x的最大整数。如: floor(2.5) = 2

空空如也

空空如也

1 2 3 4 5 6
收藏数 118
精华内容 47
关键字:

c语言负数除法

c语言 订阅