一个C语言问题
main() { float d=2.2; int x,y; x=6.2;y=(x+3.8)/5.0; printf("%d",d*y); } 答案上说输出的结果是0,我编译后得到的是乱码,求指教,到底应该输出什么??
追问:哇塞,这个太深奥了,看不懂啊
main() { float d=2.2; int x,y; x=6.2;y=(x+3.8)/5.0; printf("%d",d*y); } 答案上说输出的结果是0,我编译后得到的是乱码,求指教,到底应该输出什么??
追问:哇塞,这个太深奥了,看不懂啊
答案:看明白这个你应该就懂了。#include
int main()
{
float a = 12.5;
printf("%d\n", a);
printf("%d\n", (int)a);
printf("%d\n", *(int *)&a);
return 0;
}
参考答案:该项程序输出如下所示, 0 12 1095237632 原因是:浮点数是4个字节,12.5f 转成二进制是:01000001010010000000000000000000,十六进制是:0x41480000,十进制是:1095237632。所以,第二和第三个输出相信大家也知道是为什么了。而对于第一个,为什么会输出0,我们需要了解一下float和double的内存布局,如下:float: 1位符号位(s)、8位指数(e),23位尾数(m,共32位)
double: 1位符号位(s)、11位指数(e),52位尾数(m,共64位)
然后,我们还需要了解一下printf由于类型不匹配,所以,会把float直接转成double,注意,12.5的float和double的内存二进制完全不一样。别忘了在x86芯片下使用是的反字节序,高位字节和低位字位要反过来。所以:float版:0x41480000 (在内存中是:00 00 48 41)
double版:0x4029000000000000 (在内存中是:00 00 00 00 00 00 29 40)
而我们的%d要求是一个4字节的int,对于double的内存布局,我们可以看到前四个字节是00,所以输出自然是0了。 这个示例向我们说明printf并不是类型安全的,这就是为什么C++要引如cout的原因了。float d=2.2;
int x,y;
x=6.2;x为int型,那么x=6.2最后的结果是x = 6。
y=(x+3.8)/5.0; y为Int型,但x + 3.8这一句会强制把x转换成float型的,计算完了之后的值再给int型的y,你觉得他会变成什么样的?
你把一个float型的数赋给了一个int型的变量,在linux里面是编译不过的,或者会提示警告!但错误是未知的!自动转换是有一个规则的,但在这里条件反了,不能将float型的自动转换成int型的,int型的可以自动转换成float型。
printf("%d",d*y); 你用了一个float型的数乘一个int型的数,结果应该是float型的,但你却用的%d,看上去他只会打印整数部分,实际是一堆乱码、
定义int整型了,为什么x的值是小数,我是个新手,我们可以交流下,不懂的还要请教你下应该是二,因为你定义YX都是整型的,在复值的时候,精度就已经损失了,而且答案再一次损失精度!求答案求解释!你定义的浮整和整除了问题,输出零也好,乱码也好,都是正确的。
因为float应该用%f输出
整形用%d
有些聪明的编译器输出0
有些编译器输出乱码
都是正确的。
你真是小白啊!你都定义x是int整形了,怎么又定义x=6.2,这不是自相矛盾吗?不出现乱码才怪int 整形
float 单浮点型 显示8位
double 双浮点型 显示16位
呵呵,看看你写的是不是有问题,我给你分析一下;
int x,y; x=6.2;y=(x+3.8)/5.0
因为x被定义为整形,那么x=6;
(x+3.8)这步的时候x将被转成浮点型数(6.0+3.8)=9.8;
9.8/5.0=1.9。。。但是马上转型赋值给y,变成y=1;
printf(“%d”,y*a);b为float,那么a也会自动转型为float参与计算,结果为浮点型数,用%d肯定会是乱码的,数据溢出,用%f即可正确显示
x=6.2 其实x就是等于6
y其实就是等于1
后面的乱码是因为类型不对
把他变成%f 就可以了
上一个:关于C语言字符问题!
下一个:c语言是什么?