黑马程序员技术交流社区

标题: 为什么1.125按整型输出结果为0? [打印本页]

作者: hpuie0703    时间: 2016-2-17 16:19
标题: 为什么1.125按整型输出结果为0?
# include <stdio.h>

int main(void)
{
        float x = 1.125f;
        int a = x;
        printf("%d\n",a);//在vc++6.0中输出结果为1

        printf("%d\n", x);//在vc++6.0中输出结果为0

        return 0;
}
问题: 为什么1.125按整型输出结果为0?

作者: 流年~荒城    时间: 2016-2-17 20:05
因为你return 0.。。
作者: xiewenjian0313    时间: 2016-2-18 00:04
同学,你的代码写错了float=x 1.123f
                                          printf("%f",x);
                                        打印float的格式为%f格式。

作者: 曦正    时间: 2016-2-18 08:19
虽然不知道是为什么,但我用xcord试了,x输出的是随机值,你想要x输出1,就在打印x之前,把x强转成int类型就可以了
作者: 6666225    时间: 2016-2-18 16:17
本帖最后由 6666225 于 2016-2-18 16:18 编辑

VC的环境我也不是很懂 但是我猜测是因为
int a = x;

这一步是把单精度浮点赋值给整型 所以赋值失败
导致a没有赋值成功 a现在的值还是被创建的时候的系统初始值 默认值应该是0

验证这个猜测很简单 你把
int a = x;

这一步拆开 变成这样
int a;
printf("%d\n",a);
a=x;
printf("%d\n",a);

如果前后打印的值都为0的话 那就是说明我的猜测是对的
作者: hpuie0703    时间: 2016-2-19 13:42
# include <stdio.h>

int main(void)
{
        float x = 1.125f;
        int a;
        printf("%d\n",a);//输出结果为-858993460
        a = x;
        printf("%d\n",a);//输出结果为1

        printf("%d\n", x);//输出结果为0

        return 0;
}
//在VC++6.0中的输出结果为:
----------------------------------
-858993460
1
0
----------------------------------
问题: a的默认值不是0,而是-858993460.


作者: Moneyhome    时间: 2016-2-22 13:52
hpuie0703 发表于 2016-2-19 13:42
# include

int main(void)

printf("%d\n", x);//输出结果为0
最后调用的是va_arg ( va_list ap, int); 这个会把float类型都转成0.
你可以写代码验证一下。
作者: 王尉安    时间: 2016-2-24 22:23
本帖最后由 王尉安 于 2016-2-26 14:52 编辑

http://blog.sina.com.cn/s/blog_3d10a88301000aok.html

大概意思就是说 内存存储造成的,flot存储的数据不经过类型转化直接输出就成这样了 你换一个值可能又不一样的结果,换个系统、编译软件结果都会不同。
再具体点就是浮点数转化成二进制存储到内存中是分成整数部分和小数部分来存储的 通过字节的第一个数0或1来表示符号 同时也就没有正负号了,
而int默认是有符号的,是4个字节的第一个数的0或1来表示正负,也就导致了存储的同样的二进制数用不同的方式读取显示就不一样,

假如你1.25用float存是0101 1111 0101 0111 那么你用%d输出就是用int的方式来读,这就绝对不是不是小数或者1了,

vc6.0输出来是0肯定是编译器的读取方式照成的,再具体就得用单步执行去看它内部的代码了。

作者: 就是我    时间: 2016-2-25 23:16
因为 %d专门用来打印int类型数据,int类型数据4个字节,也就是说%d只打印四个字节数据
但是double类型数据占8个字节,你的1.125数据只能占到低位的四个字节,高位的都是0
你用%d打印double类型,结果它从高到低只打印到4个字节就结束了,所以才会出来0
忘采纳,新人缺分

作者: 18210530167    时间: 2016-2-27 23:18
1、int a=x;赋值是可能丢失精度;但我觉得a值是1;
printf("%d\n", x);这个是强制按十进制输出;我觉得这儿出错了!
作者: 友人A    时间: 2016-2-29 12:35
首先,你要明白C语言中的强制类型转换。浮点数转换为整型数,丢失精度(即小数部分),所以,你的
printf("%d\n",a);   //在vc++6.0中输出结果为1
输出为1。就能想通了。
另外你要明白C语言中printf函数的实质,它是格式输出。意思是从指定地址开始读取一片内存,并且按照指定的格式输出到屏幕上,那意思就是说,不管你这篇内存区域存储的是什么数据,它都是按照自己的方式读取并输出到屏幕上。其中指定的格式,就是所谓的%d(按整型方式输出),%f(按浮点型型方式输出)等等。而地址呢,就是你指定变量的地址。
所以,你的
printf("%d\n", x);  //在vc++6.0中输出结果为0
分析一下,你的x是浮点型变量,但是你又指定以%d(按整型方式输出)输出,按照C语言中浮点型数据的存储方式来说,理应输出一个很大的负数。但是具体输出什么是由编译器决定的。VC++6.0中把它处理成一个错误,所以输出了0.
新人缺分,望打赏~~~~~
作者: hpuie0703    时间: 2016-3-1 20:30
就是我 发表于 2016-2-25 23:16
因为 %d专门用来打印int类型数据,int类型数据4个字节,也就是说%d只打印四个字节数据
但是double类型数据占8 ...

我定义的 是float,不是double
作者: hpuie0703    时间: 2016-3-1 20:32
友人A 发表于 2016-2-29 12:35
首先,你要明白C语言中的强制类型转换。浮点数转换为整型数,丢失精度(即小数部分),所以,你的
printf("%d ...

回答含糊.
作者: 就是我    时间: 2016-3-2 08:48
hpuie0703 发表于 2016-3-1 20:30
我定义的 是float,不是double

float在c中占4个字节,int占两个字节 也是一样的
作者: 友人A    时间: 2016-3-5 11:22
hpuie0703 发表于 2016-3-1 20:32
回答含糊.

建议你去看看printf函数的用法。
作者: agaoyin    时间: 2016-3-8 13:56
把return 0 放大括号后面瞧瞧
作者: 278008379    时间: 2016-3-9 13:03
没看懂…
作者: 善毅    时间: 2016-3-9 21:28
你的输出语句有问题,应该是printf("%f",x);关键是:float的级别比int的高,类型转换的时候属于强制类型转换,损失了精度
作者: lvwangxiao    时间: 2016-3-11 22:46
printf是严格的格式输出
你用d格式来输出f格式的浮点数,不是截断了,而是失败了!
具体的要看到printf的实现才能知道后面的是怎么读取的
作者: 565866248    时间: 2016-3-20 23:05
如果输出为0,则说明a的数据放在地址的高端,而整型比浮点数内存中占的字节数少,整型只会把属于它的字节数读出来,如在Win32,VC6.0下,Int是4位,它就会把从a开始的4位读出来(按整型格式),所以它把浮点数低端地址的0给输出出来。printf要求数据类型一致。 可以这样打印浮点数内存位对应的整数。 printf("%d\n",*(&a))
作者: ImKing    时间: 2016-7-3 14:56


他们回答的都很好了,我就贴个图吧。{:3_57:}
作者: ImKing    时间: 2016-7-3 15:09
补充:
语句 printf("%d\n", x); 在vc++6.0中输出结果为 0 原因分析如下:
(1)float 4 字节(根据机器而定,这里仅举例),int 2 字节
(2)float 类型数据按照 int 型数据输出,读取的是 float 低字节内容,如果低字节内容是 0 ,则输出的是0;
        如果非 0 ,则对应显示
(3)不明白的可以留言 {:3_56:}




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2