精华内容
下载资源
问答
  • c语言除法

    2015-08-29 21:47:26
    除法是要分有符号和无符号的,当无符号与有符号进行运算时,默认转为无符号除法

    除法是要分有符号和无符号的,当无符号与有符号进行运算时,默认转为无符号除法

    展开全文
  • (1)比如 7 / 2 = 3 …… 1 -7 / 2= -3 …… -1比较重要的是,余数的绝对值小于除数的绝对值,并且余数和被除数同正负(2)由于 C语言除法是向0取整,也就是“截断除法”不难发现,正数除以正数时,截断除法相当于向...

    (1)比如 7 / 2 = 3 …… 1       -7 / 2= -3 …… -1

    比较重要的是,余数的绝对值小于除数的绝对值,并且余数和被除数同正负

    (2)由于 C语言 中除法是向0取整,也就是“截断除法”

    不难发现,正数除以正数时,截断除法相当于向下取整(3.5 -> 3);而负数除以正数时,截断除法相当于向上取整( -3.5 -> -3 )

    (3)除以2的k次幂通常会被优化成右移k位,这里考虑除以2时

    用一个signed byte表示7,是00000111,右移一位变成00000011是3,是正确的

    但是,考虑-7/2,-7是11111001,右移一位后变成11111100,这是-4,因为这是向下取整的结果,所以比正确的答案 -3少了1

    代码中为了统一和效率,如果是32位的数字,会先右移31位扩展符号位。原先是正数则最高位是0,那么最后会变成32个0,也就是0,;原先是负数最高位是1,最后会变成32个1,也就是-1,暂且把这个扩展符号位后形成的数记作S,

    那么,我们只需要把右移一位的结果,减去这个S,就可以得到正确的截断除法的值

    7/2 = 7>>1 –(0) = 3        -7/2 =-7>>1 – (-1)= -3

    (这一点在例题代码中会再次提到)

    (4)当除以正数N,而N不是2的次幂时,编译器会生成一个magic_number(C),以使除法优化成乘法,提高效率

    158a7bdedf96ab6c96205c00fe730e0b.png

    注意我强调的……(n,c)这个取值是成对的,一般取右移的位数n大于64,(理由一会再解释),比如n取72,这样C也就是常数了

    图片中的证明表示:被除数(正数)乘以magic_number后再右移n位,即为除法的结果;如果是负数需要 +1

    没错…就是第三点,最后统一减去符号扩展形成的数即可

    好了,背景介绍的差不多了,来道CTFtime上的题目吧 :https://ctftime.org/task/5294?tdsourcetag=s_pcqq_aiomsg

    f0028246c3987f09aa0b7e544754a388.png

    简单看下,这就是除以N的除法优化代码,题目一般都是二分查找搞定flag的,这里作为一个较真的人……用数学来解一下

    汇编代码中,0x49ea309a821a0d01就是magic_number

    sar   $0x3f,%rdi   因为long long是64位的,这里把函数参数rdi(被除数)右移63位,原先是正数则rdi变为0,原先是负数则rdi变为-1

    imul %rdx之后,因为被除数被保存在了rax之中,因此乘积高位被放在rdx,低位被放在rax,最后我们发现乘积低位rax在后面没有被用到

    原因是第四点背景提到的,n取值要大于64,这样128位的乘积只需要考虑rdx就可以了,乘积低64位rax被移位后必定为0,无需考虑,也提高了效率

    后面因为rax作为返回值,x*c>>n被保存在了rax中,再sub rax,rdi

    也就是我们提到的减去符号拓展形成的数

    这个证明可能需要好好理解下(手写推导一次…)

    好了现在我们看看flag(除数)是多少

    因为我们最后只保留了乘积高位rdx,把rdx右移了0x30位

    这就相当于把128位乘积右移了(64+0x30)==112位

    那么,因为c = 2^n / y   y = 2^n / c (其中c就是magic_number)

    现在c已知,为0x49ea309a821a0d01,n已知,为112

    算出除数y即可

    注意的是这里虽然除法结果是精准的,但是反推除数时 python 的计算结果可能会有1的误差,这一点用二分算法时也会出现

    其实除以正数还有第二种情况的优化算法,编译器根据C的值会有不同的选择,这就是《加密与解密》上除以正非2次幂的优化公式2,比如此题

    afd321b08b1273fb9405246ff5374ba9.png

    以及除数为负数的稍复杂情况就不讨论了,相关内容可以看下《加密与解密》和《C++反汇编与逆向分析揭秘》,前者结论全面,后者推导较多

    展开全文
  • C语言除法,取余

    万次阅读 2019-03-30 11:28:13
    C语言中的除法运算有点奇怪,不同类型的除数和被除数会导致不同类型的运算结果 当除数和被除数都是整数时,运算结果也是整数;如果不能整除,那么就直接丢掉小数部分,只保留整数部分,这跟将小数赋值给整数类型是...

    C语言中的除法运算有点奇怪,不同类型的除数和被除数会导致不同类型的运算结果
    当除数和被除数都是整数时,运算结果也是整数;如果不能整除,那么就直接丢掉小数部分,只保留整数部分,这跟将小数赋值给整数类型是一个道理。
    一旦除数和被除数中有一个是小数,那么运算结果也是小数,并且是 double 类型的小数。
    #include <stdio.h>
    int main()
    {
    int a = 100;
    int b = 12;
    float c = 12.0;

    double p = a / b;
    double q = a / c;
    
    printf("p=%lf, q=%lf\n", p, q);
    
    return 0;
    

    }
    运行结果:
    p=8.000000, q=8.333333

    a 和 b 都是整数,a / b 的结果也是整数,所以赋值给 p 变量的也是一个整数,这个整数就是 8。

    另外需要注意的一点是除数不能为 0,因为任何一个数字除以 0 都没有意义。

    1、%前后必须为整数,不可以为小数等。2、%后面不允许为0。

    展开全文
  • 一个自然数被8余1,所得的商被8...*问题分析与算法设计根据题意,可设最后的商为i(i从0开始取值),用逆推可以列出关系式:(((i*8+7)*8)+1)*8+1=((2*i*17)+15)*18+4再用试探求出商i的值。*程序说明与注释#incl...

    一个自然数被8除余1,所得的商被8除也余1,再将第二次的商被8除后余7,最后得到一个商为a。又知这个自然数被17除余4,所得的商被17除余15,最后得到一个商是a的2倍。求这个自然数。

    *问题分析与算法设计

    根据题意,可设最后的商为i(i从0开始取值),用逆推法可以列出关系式:

    (((i*8+7)*8)+1)*8+1=((2*i*17)+15)*18+4

    再用试探法求出商i的值。

    *程序说明与注释

    #include

    int main()

    {

    int i;

    for(i=0;;i++) /*试探商的值*/

    if(((i*8+7)*8+1)*8+1==(34*i+15)*17+4)

    { /*逆推判断所取得的当前i值是否满足关系式*/

    /*若满足则输出结果*/

    printf("The required number is: %d\n",(34*i+15)*17+4);

    break; /*退出循环*/

    }

    }

    *运行结果

    The required number is:1993

    展开全文
  • 小编典典C#的历史可追溯到C,因此答案为“为什么C#会...(所以我的问题是,“为什么类C语言中的整数除法不返回 两个整数 ”,而不是“为什么不返回浮点值?”)解决方案是为除法和余数提供单独的运算,每个运算返...
  • C语言中整除是 / 符号,%符号是取余运算符。整除运算符( / )需要注意的就是运算结果会自动转换为与被数一致的数据类型。举例说明如下:int a=5, b=2; float c; c = .我说整除这个符号 就像求余是%我觉得整除就是...
  • C语言除法运算符“/”和求余运算符“%”
  • 解题思路:可以假设第一次运算后的商为a, 则第二次运算的商为2*a。将这两次运算写成两个表达式。对商a的初始值可以随机取,不断加减a,直到两个表达式的差为0。最后将a带入任意表达式,就可得出结果。...
  • 一、C++中的整数除法C++中整数除法和取余用的是truncate除法(舍0取整),而给无符号类型赋值超出表示范围时候用无符号类型等于赋值对无符号类型可以表示的数值总数取余,智力的取余是基于floor除法的(向下取整)。...
  • C语言的math.h头文件中有ceil和floor两个函数: double ceil(double x); float ceilf(float x); long double ceill(long double x);...于是当整数除法向上取整的时候就会出现这种情况: int a = 10,
  • C语言除法和取余

    千次阅读 2020-01-25 21:07:01
  • 用c模拟浮点数硬件除法 有四舍五入及特殊情况分析
  • C语言有以下几种取整方法:1、直接赋值给整数变量。如:int i = 2.5;...整数除法对正数的取整是舍去小数部分,但是整数除法对负数的取整结果和使用的C编译器有关。3、使用floor函数,向下取整。f...
  • c语言除法计算和取模计算

    千次阅读 2019-05-25 17:23:20
    下面的题目你可以全部都做对么: ...除法的取整分类除法的取整分为三类:向上取整、向下取整、向零取整。1、向上取整:向+∞方向取最接近精确值的整数。在这种取整方式下,6/5=2 6/(-5)=-1 6/4=2 6/(-3)=-22、向下...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼目前的51单片机在进行带小数点结果的除法一般可以采用浮点数计算的方式,但是浮点数计算有一个缺点就是非常耗时,在对时间要求严格的工况就不太适用。笔者的工作室长期...
  • ![图片](https://img-ask.csdn.net/upload/201611/12/1478954997_864497.jpg)
  • 版权声明:以上文章中所选用的图片及文字来源于网络以及用户投稿,...简介:第2章 C运算符和表达式——强制类型转换C语言程序设计第2章 C运算符和表达式问题的提出Example:int total, number;float aver;…aver =...
  • C语言 除法问题

    2012-02-27 16:26:27
    4个16bit的数组(unsigned short[4]) 除以一个unsigned int(32位) 找个合适的算法
  • c语言除法原理

    2012-01-09 21:39:42
    学了很久c与语言了 但不知道除法在计算机内存中的表示
  • C语言除法运算符“/”和求余运算符“%”  看似两个很简单的运算符,却也真要掌握用好它也不容易,本文作为关于此类运算符的各方面的问题的汇总,希望对你我都有一些帮助。   除法运算符“/”。二元运算符,...
  • C程序计算商和余数在此示例中,您将学习求一个整数除以另一个整数的商和余数。计算商数和余数的程序#...printf("输入被数:");scanf("%d",&dividend);printf("输入除数:");scanf("%d",&divisor);/...
  • 这题主要考察对C语言输入输出的运用。代码如下:#include "stdio.h"#include "math.h"#include "conio.h"main(){int i,j;long a,b,c,d,e;printf("please input two numbers:\n");scanf("%d%d",&i,&j);a=i+j;...
  • ①y/4 ② if(y) y+=3;y >>= 2 ①和②为什么是等价的?那个3是怎么弄出来的?
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼题目描述a/b。 a,b为integer范围内的整数。 求a/b的前n位小数商。输入a b n输出一行数字样例输入97 61 50样例输出1....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,500
精华内容 21,400
关键字:

c语言除法

c语言 订阅