【www.arisingsemi.com--IT认证】

四舍五入是什么意思
在C语言中,强制转换后的数是四舍五入还是去尾。
去尾要想四舍五入的话(int)(number+0.5)
都是直接去尾的。当为数太多时直接截断。所以在强制转换时要很注意
有四舍五入的情况,在你想要保留几位小数的时候,多余的紧接着的一位要四舍五入不过C里面没有提供四舍五入的函数,不过你可以这样 a = (int)(a*100 + 0.5)/100这只是一个小技巧,对a的第三位进行四舍五入
提问者评价
+0.5可以解决这个问题。谢谢你。
C语言中的float和double类型数据是浮点数,所以小数部分就存在四舍五入问题,当指定输出位数在精度范围之内时,系统会自动舍入,无需人工干预,如果小数部分也在精度范围内,比如10.0/2.0 = 5.0,2位以上的输出位数时,后面的都是0,此时,当然不需要舍入了。数据类型转换有两种方式,一种是默认强制转换,比如将char、short、Int、Long和float类型数据赋给double类型变量时,编译程序会自动实施转换,这是因为,在精度更高时,这样的转换是内有损失的。另一种是手动强制类型转换,比如dnum = (double)inum;,意思是将整形变量inum首先转换为双精度数据,然后再付给dnum。当将高精度类型变量赋给低精度类型变量时,除非手动强制转换,否则,编译程序会有提示的。
数据强制转换是用舍弃的方法,不会用四舍五入,什么时候用四舍五入是需要详细说明的,也就是你的业务需求而定,你可以把数字+0.5,然后进行强制转换
ouble强制转换成int型的时候保留整数部分的。。比如double a=1.5;int b=a;a就是1。

2012-03-11
17:52匿名 | 分类:C/C++ | 浏览2634次
int a,b;  //keil c里的int,也就是16位。a=0000; b=0x1234;a=(char)(b);问题:此时a的值是。
a的类型是。
分享到:
2012-03-11
19:08提问者采纳
你好。
一步一步来int a,b;这句的功能是操作系统为变量a,b分别分配一块空闲的存储空间以后使用a,b将相当于访问各自所对应的存储空间a = 0000;b = Ox1234;这句的功能是把0000放到变量a所对应的存储空间把0x1234放到变量b所对应的存储空间重点是下面这句a = (char)(b)它的功能相当于修改变量a的值,具体是这样操作的,从b所对应的存储空间中取出b的值即0x1234,然后把他转换成char类型,再然后将转换后的结果放到变量a所对应的存储空间,即覆盖掉原来的0000这个转换后的结果又是多少呢,是这样算的通常在C中int类型占4个字节  而char类型占1个字节如果把一个int类型的数据以char类型输出,那么,编译器会自动丢弃int类型的前3个字节的内容对应本题int类型的数据b是0X1234  为十六进制在计算机中是这样存储的0000 0000 0000 0000 0001 0010 0011 0100共4个字节转换成char类型后,前3个字节丢弃即结果是0011 0100  共1个字节  对应的十进制是52当语句a = (char)(b)执行完后这1个字节的值也就是52就放到了变量a所对应的存储空间,而不是原来的0000了所以,整个过程并没有改变变量a和b的数据类型    原来是int类型现在还是int型,程序只是修改了变量a的值,连b的值都没有修改,因为修改a的值时只是从b所对应的存储空间里把b的值取出来用一用,用的结果是修改成char类型,但他把修改后的结果放到a所对应的存储空间了,并没有放到b所对应的存储空间,所以原来b所对应的值没有被覆盖,原来是0X1234,现在还是0X1234仅供参考。呵呵
追问
晕,你肯定是用VC的,所以在你理解里,int型的为32位,而我题目中就说了,我用的是keil c,一个int型的点2个字节,也就是16位。当然这不影响理解“强制转换”这个概念。总之,你的意思是:a=(char)(b);的结果是:a==0x0034,int型,b==0x1234,int型,对吗。

回答
最终结果 :变量a: int类型,其值是0x0034变量b: int类型,其值不变,还是0x1234我说的的确是vc中的,你的int类型是16个字节那过程应该也一样,应该不影响你理解呵呵
提问者评价
嗯,呵呵,谢谢大师。。
评论(3) | 11 0

r1renhw | 八级 采纳率34%
擅长: C/C++ 数据结构及算法 C#/.NET JavaScript
l 2007-12-25c语言中可以用强制类型转换 8
l 2010-01-31c语言 强制类型转换 5
l 2013-04-30C语言中强制类型转换问题 2
l 2013-10-14c语言题目强制类型转换 1
更多关于c语言强制转换四舍五入的问题>>
按默认排序 | 按时间排序
2012-03-11
17:56123冰霜雪月 | 六级
a是int型的  b是char型的然后转换类型转换就是(加上你要转的类型)有问题再问
追问
这里b变成了char型。。
那它变成char型后值为多少。它的值赋给a后,a类型不变。还有,a的值为多少。

评论 | 1 0
2012-03-11
18:26QQ925526512 | 四级
此时a的值是52,仍然是int型。
补:b的类型并没有发生变化,同样是int型,值也没有改变。
追问
a的值为0x0034。
还是0x3400。就是说,最终类型都不会变,只有在赋值的过程中暂时将b强制转换成char型,取低位

(34)赋值给int型的a,a接收到一个char型的值的处理办法是也将这个值装在低位,对吗。

回答


1、(char)(b)是将b强制转换成char型(注:实际上b没有任何变化,你可以理解为一个中间结    果。),由于char只占8位,而b有16位,所以造成数据丢失(丢失的是高8位)。


2、将得到的8位赋值给a(16位),(注意。)两者类型不同,再次转换,低8位直接赋值,高8位全部补上0或1。


3、
【先提及一下,计算机是以补码的形式存储数据的】(char)(b)得到的是0x34,二进制原码为:0011 0100,补码为:0011 0100(正数的原码跟补码一样)。2中提到的补0或补1,是由补码的最高位决定的,为0则补0,1则补1。因此a最终的值为0000 0000 0011 0100,化为十进制为52.补:为什么要强调补0补1,及原码补码的问题。举个简单例子就能明白,若题目中的b的初值改为0x12F4,那么最终得到的a值将是  -12 (十进制),而非0x00F4(16进制)
追问
同时也感谢你。
。只是百度的系统不能同时采纳两个标准答案*-*。
。。

本文来源:http://www.arisingsemi.com/it/71305/