精华内容
下载资源
问答
  • C语言小白入门日记之运算中的整数型和浮点
    2020-02-15 15:47:07

    运算中整数型与浮点型的处理
    整数型的除法运算是舍位运算,而不是四舍五入,如 int t;t=20/3;这里的结果t=6;浮点型的运算按精度要求四舍五入。
    当运算中的两个数分别是浮点型和整数型是以浮点型的规则进行运算,当出现整数常数时,如3,可以写成3.0来表示浮点型格式。当算式中超过三个数是,从左到右分别按如上两位数的规则进行。

    以下举例来说明一些情况:
    首先说明各个数值的类型,其次举例说明结果。
    1.整数型=浮点型/整数型:
    这个是以浮点型来运算的,但是结果是整数型的,例20.0/3=6.66…,但由于结果是整数型的,进行舍位,结果为6;
    2.浮点型(0.1f)=浮点型/整数型:浮点型规则运算,结果等于6.7;
    3.浮点型=整数型/整数型:整数型运算,计算结果舍位,等于6.0;
    4.整数型/整数型×浮点型,同级运算从左到右,这里先进行整数型的除法,再进行浮点型乘法,如11/4×10.0=20;因为整数除法会舍位,故11/4=2,2×10=20.
    给我们的教训是我们在写程序时应注意变量类型的的定义,以及对精度有要求时尽量先计算浮点型,出现常数时用3.0这个书写形式定于为浮点型。

    更多相关内容
  • 第二章C语言的数据类型和运算课案第二章 C语言的数据类型和运算2.1 数据类型数据是计算机加工处理的对象,C语言中的数据包括:常量、变量和有返回值的函数。为存储和处理的需要,将数据划分为不同的类型,编译程序为...

    第二章C语言的数据类型和运算课案

    第二章 C语言的数据类型和运算

    2.1 数据类型

    数据是计算机加工处理的对象,C语言中的数据包括:常量、变量和有返回值的函数。为存储和处理的需要,将数据划分为不同的类型,编译程序为不同的类型分配不同大小的存储空间(存储单元的字节数),并对各种类型规定了该类型能进行的运算(运算符集),任何类型数据的值均被限制在一定的范围内,称为数据类型的值域(取值范围)。

    2.1.1 C的数据类型

    说明: ● 构造类型是由基本类型按一定的规律构造而成的。

    空类型的作用:①表示函数没有返回值;

    ②说明函数无参数;

    ③表示指针不指向任何值。

    2.1.2 数值型数据的表示与存储形式

    如π的表示: 日常表示 C语言中的表示

    小数点的位置是浮动的,称为浮点数形式。在计算机内部实数都以浮点形式存储,如float占4个字节,三个字节存数字部分,一个字节存指数部分。

    小数点的位置是固定的,称为定点数,如:3.14159 ,10,-20, 1992显然整数都属于定点数,如:整数10,在计算机内部一般占2个字节。

    定点数的小数点一般是在最高位(定点小数)或在最低位(定点整数)。对于实数型定点数如:3.14159,C语言则把它按指数形式存放3.14159e0,即C的实数一律以浮点形式存储。

    2.1.3字符型数据的表示和存储形式

    字符型数如:(’a’,’A’,’#’,’3’)在内存中以相应的ASCII代码存放(占一个字节),如’a’的ASCII代码为97,存储形式为:

    在C中,ASCII代码值可以被看成整数,如’A’+32为97与’a’等价。

    2.1.4 基本类型的名字和长度

    下列关键字称为类型区分符:

    char、 int、 short、 long、 signed 、unsigned 、float、double

    类型区分符代表一个基本类型的名字,用来说明一个数据的类型。

    表2.1 基本类型的名字和长度

    完整的类型名简单的类型名类型的长度(字节)取值范围char char 1有符号:-128~127

    无符号:0~255signed charsigned char1-128~127unsigned charunsigned char10~255int int 2或4(与具体机器有关)2字节:-32768~32767

    4字节:约-21亿~21亿short intshort2-32768~32767long intlong4约-21亿~21亿signed int signed2或4 (同int)同intunsigned intunsigned2或 4(同int)2字节:0~65535

    4字节:约0~42亿signed short int signed shor2-32768~32767unsigned short intunsigned short20~65535singed long int signed long 4约-21亿~21亿unsigned long intunsinged long4约0~42亿float float4 绝对值约

    13.4e-38~13.4e+38double double8绝对值约:

    1.7e-308~1.7e+308long doublelong double>=8由具体实现定义说明:

    ①signed和unsigned不能同时修饰char,short和long或signed和unsigned不能同时修饰int。float不能使用任何修饰词,double可用long修饰;

    ②int的长度与具体机器的字长相同,在16位机上为2字节,在32位机上为4字节。因此,int 的长度与short或long 相同。

    ③signed char用1个字节的低7位表示字符值,最高位表示符号。

    unsigned char用整个字节表示字符值,无符号位。char表示有符号和无符号与具体机器系统有关,但char一定和signed char或unsigned char其中之一同。在多数机器系统中,char与signed char同。

    ④浮点类型的范围与浮点在机器内的表示有关,标准C没有规定浮点数格式,大多数机器浮点数格式为:

    对于4个字节浮点数,阶码占8位,尾数占23位,1位符号位:

    对于8字节的浮点数:

    在浮点数中尾数位决定精度(有效数字位数),阶码决定取值范围。

    ⑤对于带符号的数据类型,一般用最高位(左边第1位)表示符号,0表示正,1表示负,数值以补码形式存放(一个正数的补码是该数的二进制数),如(

    展开全文
  • } 复制代码 代码如下: //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。 //调用:accMul(arg1,arg2) //返回值:arg1乘以arg2的精确结果 function ...

    复制代码 代码如下:

    //说明:javascript的加法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的加法结果。

    //调用:accAdd(arg1,arg2)

    //返回值:arg1加上arg2的精确结果

    function accAdd(arg1,arg2){

    var r1,r2,m;

    try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}

    try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}

    m=Math.pow(10,Math.max(r1,r2))

    return (arg1*m+arg2*m)/m

    }

    复制代码 代码如下:

    //说明:javascript的减法结果会有误差,在两个浮点数相加的时候会比较明显。这个函数返回较为精确的减法结果。

    //调用:accSub(arg1,arg2)

    //返回值:arg1减上arg2的精确结果

    function accSub(arg1,arg2){

    return accAdd(arg1,-arg2);

    }

    复制代码 代码如下:

    //说明:javascript的乘法结果会有误差,在两个浮点数相乘的时候会比较明显。这个函数返回较为精确的乘法结果。

    //调用:accMul(arg1,arg2)

    //返回值:arg1乘以arg2的精确结果

    function accMul(arg1,arg2)

    {

    var m=0,s1=arg1.toString(),s2=arg2.toString();

    try{m+=s1.split(".")[1].length}catch(e){}

    try{m+=s2.split(".")[1].length}catch(e){}

    return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)

    }

    复制代码 代码如下:

    //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显。这个函数返回较为精确的除法结果。

    //调用:accDiv(arg1,arg2)

    //返回值:arg1除以arg2的精确结果

    function accDiv(arg1,arg2){

    var t1=0,t2=0,r1,r2;

    try{t1=arg1.toString().split(".")[1].length}catch(e){}

    try{t2=arg2.toString().split(".")[1].length}catch(e){}

    with(Math){

    r1=Number(arg1.toString().replace(".",""))

    r2=Number(arg2.toString().replace(".",""))

    return (r1/r2)*pow(10,t2-t1);

    }

    }

    时间: 2013-12-23

    展开全文
  • 一、正整数的十进制转换二进制:要点:除二取余,倒序排列解释:将一个十进制数除以二,得到的商再除以二,依此类推直到商等于一或零时为止,倒取将除得的余数,即换算为二进制数的结果例如把52换算成二进制数,计算...

    一、各种进制的相互转换

    先比比一下二进制的缺点,移植性差。

    一、正整数的十进制转换二进制:要点:除二取余,倒序排列

    解释:将一个十进制数除以二,得到的商再除以二,依此类推直到商等于一或零时为止,倒取将除得的余数,即换算为二进制数的结果

    例如把52换算成二进制数,计算结果如图:

    b871d8a1cfee

    52除以2得到的余数依次为:0、0、1、0、1、1,倒序排列,所以52对应的二进制数就是110100。

    由于计算机内部表示数的字节单位都是定长的,以2的幂次展开,或者8位,或者16位,或者32位....。

    于是,一个二进制数用计算机表示时,位数不足2的幂次时,高位上要补足若干个0。本文都以8位为例。那么:

    (52)10=(00110100)2

    二、负整数转换为二进制

    要点:(正数除二取余,倒序排列)取反加一

    解释:将该负整数对应的正整数先转换成二进制,然后对其“取补”,再对取补后的结果加1即可

    例如要把-52换算成二进制:

    1.先取得52的二进制:00110100

    2.对所得到的二进制数取反:11001011

    3.将取反后的数值加一即可:11001100

    即:(-52)10=(11001100)2

    b871d8a1cfee

    三、小数转换为二进制

    要点:(小数)乘二取整,正序排列

    解释:对被转换的小数乘以2,取其整数部分(0或1)作为二进制小数部分,取其小数部分,再乘以2,又取其整数部分作为二进制小数部分,然后取小数部分,再乘以2,直到小数部分为0或者已经去到了足够位数。每次取的整数部分,按先后次序排列,就构成了二进制小数的序列

    例如把0.2转换为二进制,转换过程如图:

    b871d8a1cfee

    0.2乘以2,取整后小数部分再乘以2,运算4次后得到的整数部分依次为0、0、1、1,结果又变成了0.2,

    若果0.2再乘以2后会循环刚开始的4次运算,所以0.2转换二进制后将是0011的循环,即:

    (0.2)10=(0.0011 0011 0011 .....)2

    循环的书写方法为在循环序列的第一位和最后一位分别加一个点标注

    四、二进制转换为十进制:

    整数二进制用数值乘以2的幂次依次相加,小数二进制用数值乘以2的负幂次然后依次相加!

    比如将二进制110转换为十进制:

    首先补齐位数,00000110,首位为0,则为正整数,那么将二进制中的三位数分别于下边对应的值相乘后相加得到的值为换算为十进制的结果

    b871d8a1cfee

    如果二进制数补足位数之后首位为1,那么其对应的整数为负,那么需要先取反然后再换算(这里显然他的方法是错的,应该取反后加1)

    比如11111001,首位为1,那么需要先对其取反,即:-00000110

    00000110,对应的十进制为6,因此11111001对应的十进制即为-6

    换算公式可表示为:

    11111001=-00000110

    =-6                        //应该是-7

    如果将二进制0.110转换为十进制:

    将二进制中的三位数分别于下边对应的值相乘后相加得到的值为换算为十进制的结果

    二、C语言中的一些运算

    1.位级运算

    C语言支持按位布尔运算,包括:

    & 与 (AND),

    | 或 (OR),

    ~ 取反 (NOT),

    ^ 异或 (EXCLUSIVE-OR)。

    有以下常用结论:

    对于任意向量a,有a ^ a = 0.

    异或(^) 是可交换的和可结合的。a ^ (a ^ b) = (a ^ b) ^ b = b; b ^ (a ^ b) = (b ^ b) ^ a = a.

    0 ^ A = A (0 异或任何数 A 结果还是 A).

    位级运算常见用法:实现掩码运算。

    这里掩码指位模式,表示从一个字中选出的位的集合。比如掩码 0xFF(最低的8位为1)表示一个字的低位字节。x = 0x89ABCDEF, 那么 x & 0xFF = 0x000000EF,生成由x的最低有效字节组成的值。

    2.逻辑运算

    &&与运算,双目,对应数学中的“且”左结合1&&0、(9>3)&&(b>a)

    ||或运算,双目左结合1||0、(9>3)||(b>a)

    !非运算。单目右结合!a、!(2<5)

    逻辑运算的结果

    在编程中,我们一般将零值称为“假”,将非零值称为“真”。逻辑运算的结果也只有“真”和“假”,“真”对应的值为 1,“假”对应的值为 0。

    1) 与运算(&&)

    在C中如果前一个条件为真,后面就不看了,所以,后面即使语法或逻辑有误也可能不会报错。

    参与运算的两个量都为真时,结果才为真,否则为假。例如:

    5&&0

    5为真,0为假,相与的结果为假,也就是 0。

    (5>0) && (4>2)

    5>0 的结果是1,为真,4>2结果是1,也为真,所以相与的结果为真,也就是1。

    2) 或运算(||)

    参与运算的两个量只要有一个为真,结果就为真;两个量都为假时,结果为假。例如:

    10 || 0

    10为真,0为假,相或的结果为真,也就是 1。

    (5>0) || (5>8)

    5>0 的结果是1,为真,5>8 的结果是0,为假,所以相或的结果为真,也就是1。

    3) 非运算(!)

    参与运算的量为真时,结果为假;参与运算的量为假时,结果为真。例如:

    !0

    0 为假,非运算的结果为真,也就是 1。

    !(5>0)

    5>0 的结果是1,为真,非运算的结果为假,也就是 0。

    优先级

    逻辑运算符和其它运算符优先级从低到高依次为:

    赋值运算符(=) 

    && 和 || 低于关系运算符,! 高于算术运算符。

    按照运算符的优先顺序可以得出:

    a>b && c>d  等价于  (a>b)&&(c>d)

    !b==c||d

    a+b>c&&x+yc)&&((x+y)

    另外,逻辑表达式也可以嵌套使用,例如a>b && b || 9>c,a || c>d &&  !p。

    3.移位运算

    b871d8a1cfee

    b871d8a1cfee

    b871d8a1cfee

    四、有符号和无符号整型

    strlen的返回值类型为size_t,C语言中将size_t定义为unsigned int,当s比t短时,strlen(s) - strlen(t)为负数,但无符号数的运算结果隐式转换为无符号数就变成了很大的无符号数.

    数getpeername的安全漏洞

    2002年,从事FreeBSD开源操作系统项目的程序员意识到,他们对getpeername函数的实现存在安全漏洞。代码的简化版本如下:

    b871d8a1cfee

    在这段代码里,第7行给出的是库函数memcpy的原型,这个函数是要将一段指定长度为n的字节从存储器的一个区域复制到另一个区域。

    从第14行开始的函数copy_from_kernel是要将一些操作系统内核维护的数据复制到指定的用户可以访问的存储器区域。对用户来说,大多数内核维护的数据结构应该是不可读的,因为这些数据结构可能包含其他用户和系统上运行的其他作业的敏感信息,但是显示为kbuf的区域是用户可以读的。参数maxlen给出的是分配给用户的缓冲区的长度,这个缓冲区是用参数user_dest指示的。然后,第16行的计算确保复制的字节数据不会超出源或者目标缓冲区可用的范围。

    不过,假设有些怀有恶意的程序员在调用copy_from_kernel的代码中对maxlen使用了负数值,那么,第16行的最小值计算会把这个值赋给len,然后len会作为参数n被传递给memcpy。不过,请注意参数n是被声明为数据类型size_t的。这个数据类型是在库文件stdio.h中(通过typedef)被声明的。典型地,在32位机器上被定义为unsigned int。既然参数n是无符号的,那么memcpy会把它当作一个非常大的正整数,并且试图将这样多字节的数据从内核区域复制到用户的缓冲区。虽然复制这么多字节(至少231个)实际上不会完成,因为程序会遇到进程中非法地址的错误,但是程序还是能读到没有被授权的内核存储器区域。

    我们可以看到,这个问题是由于数据类型的不匹配造成的:在一个地方,长度参数是有符号数;而另一个地方,它又是无符号数。正如这个例子表明的那样,这样的不匹配会成为缺陷的原因,甚至会导致安全漏洞。幸运的是,还没有案例报告有程序员在FreeBSD上利用了这个漏洞。他们发布了一个安全建议,“FreeBSD-SA-02:38.signed-error”,建议系统管理员如何应用补丁消除这个漏洞。要修正这个缺陷,只要将copy_from_kernel的参数maxlen声明为类型size_t,也就是与memcpy的参数n一致。同时,我们也应该将本地变量len和返回值声明为size_t。

    五、整数运算

    六、浮点数

    关于浮点数的细节标准:浮点数的表示;

    展开全文
  • C语言——整型和浮点型混合运算

    千次阅读 多人点赞 2020-05-08 21:39:53
    C语言int和double混合运算时,会自动将int类型的数据转换为double类型的数据,最后得到的结果也是double类型。如下例: double a=4.0/9.0; int b=9*a;//b=3,因为double类型的4.0/9.0的值要小于4.0/9.0的实际值...
  • 题目描述:输出两个不超过100位的大整数的乘积。输入:输入两个大整数,如1234567 123输出:输出乘积,如:151851741样例输入:1234567 123样例输出:151851741注意:在oj上不能直接套用我的代码,需要将无关的输出...
  • 本文笔者将着重介绍浮点型数据的存储,是相对于整形数据全新的领域哦,一起学习吧!。 提示:以下是本篇文章正文内容,下面案例可供参考 一、引子 我们用int创建了一个变量n=9,将n的地址取出,并将其强制类型转换...
  • 一个简单的解决办法是:不要用浮点数来存储浮点,对于VC,Java,Basic,最好的办法是用Decimal来保存它。 下面是分别的实现:(以加法为例,其它四则运算处理相同)VC中:doubledoublAdd(doubledbl1,doubledbl2){...
  • c语言可以直接调用浮点(小数)来进行加减乘除,但是汇编中怎样计算两个浮点数的加减乘除呢?本程序先将两个小数化为整数,然后计算其相乘结果,再化为小数输出,从而实现浮点数的相乘
  • atof(将字符串转换成浮点型数) 表头文件 #include <stdlib.h> 定义函数 double atof(const char nptr); 函数说明 atof()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而...
  • C语言浮点数

    2021-05-24 01:18:16
    C语言中采用float和double关键字来定义小数,float称为单精度浮点型,double称为双精度浮点型,long double更长的双精度浮点型。在任何区间内(如1.0 到 2.0 之间)都存在无穷多个实数,计算机的浮点数不能表示区间内....
  • 整数、浮点数布尔值整数字面量1.可以使用二进制,八进制,十进制,十六进制来表达一个整数字面量.默认为十进制.二进制:0b 八进制:0o 十六进制:0x,字母必须用小写,不能是大写2.如果字面量过长,我们可以使用下划线进行...
  • 整数加减运算的C语言实现标签: 大整数加减 C一. 问题提出培训老师给出一个题目:用C语言实现一个大整数计算器。初步要求支持大整数的加、减运算,例如8888888888888+1112=8888888890000或1000000000000-...
  • C# int a = 1; int b = (int)(a * 100 * 0.01f); 打印出来b=0 如果直接使用 int b = (int)(1 * 100 * 0.01f); 打印出来b=1
  • } 2.5向量相乘(1,N)*(N,1) /* brief:向量相乘(1,N)*(N,1) ** param[0]:向量A ** param[1]:向量B ** param[2]:向量长度 ** output:浮点数 */ ElemType vecDotVecToElem(const Vector vecA, const Vector vecB, ...
  • 在Go语言编程中,数据类型用于声明函数变量、常量的数据类型。数据类型这个概念主要是为了提高内存的利用效率,因为不同数据存储在内存中所需要的空间大小是不一样的,所以编程时指定数据类型,可以充分利用内存...
  • ↵很多刚学编程的小伙伴们一拿到这道题是都觉得很简单,心想:这不就是循环嘛,goto...我们都知道,为了方便存储运算,C语言中将数据类型分为整型的char,short,int,long ,long long ,和浮点类型的float,double ...
  • C语言输入3个整数求其中的最小值的源代码如下: include int main(){ int x=10;int y=20;int z=30;int max=(x>y?x:y)>z?y:z;printf(\"max=d\\n\",max);return 0;} 扩展资料 1、return代表函数执行 4、 printf("和...
  • 浮点数的加减乘除运算步骤

    千次阅读 2021-05-25 05:24:45
    1、浮点加减法的运算步骤设两个浮点数 X=Mx※2Ex Y=My※2Ey实现X±Y要用如下5步完成:①对阶操作:小阶向大阶看齐②进行尾数加减运算③规格化处理:尾数进行运算的结果必须变成规格化的浮点数,对于双符号位的补码...
  • 按:计算机组成课程第四周作业算法证明 图表 1 浮点数的表示浮点数的表示如上图所示,我们要做的是将按如上方式存储的两个浮点数相乘,将其结果用如上的方式表示。符号位只是两者的异或,指数位基本上是两指数的相加...
  • 使用OC语言编写两个超大数相乘或相加的算法的思路和超大正整数相乘的代码正文:在编程中,无论是OC还是C亦或是C++语言,所声明的整数变量都会在内存中占有固定的存储空间,而这些存储空间都是固定的。比如我们知道的...
  • 踩雷 整数和浮点数之间的转换 精度丢失C++ 我们在使用浮点数和整数之间会有一个雷区,那就是当分子分母都是整数时,答案也是整数 cout << 1 / 2 << endl; //输出0 这时候我们应该要给1或者2变成一个...
  • c语言两个浮点数相加As we know that modules also known as the remainder of the two numbers can be found using the modulus (%) operator which is an arithmetic operator in C/C++. The modules operator ...
  • 任意长度的高精度大整数和浮点数的加法和乘法一. 任意长度的高精度大整数加法方法:这里用了数据结构栈,实际上栈更方便实现高精度加法。步骤:1、第一个数据加数按输入顺序(高位到低位)入栈1。此时栈顶为最低位2、...
  • c语言次方(c程序怎么编写x的y次方)

    千次阅读 2021-04-16 01:26:18
    for (i = 0; i < n; i++) { result *= num; // num 为底数,n 为幂, result 为结果 }循环表示:S=a^10可表示为:for(int...C语言的幂运算是很耗资源的,10的3次方一般表示为10*10*10,或者for循环乘10,这样电脑...
  • 表达式语句4. 运算符的优先级5. 类型转换参考资料 1. 概述 什么是运算符?其实我们并不陌生,从小到大已经接触得非常多了,对其已经非常熟悉了,所以不要害怕。就举一个最简单的例子,加法就是一个数学运算符,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,715
精华内容 1,086
关键字:

c语言整数与浮点相乘