C语言之浮点型 5
float a = 3.6 ;
printf("a = %d \n",a);
输出的结果为:
-10 7374 1824
把3.6改成3.5输出的结果为0。
float a=3.6 在内存中这样存放的大概是这样的:
0100 0000 0110 0110 0110 0110 0110 0111
int ,float在vc++6.0中同样占4个字节。
%d取出来怎么是个负数。高位为0,不是正数嘛。 展开
LZ看错了吧。
3.6内存
66 66 66 40
3.5内存
00 00 60 40
浮点数包括float和double两种类型,float占32位,double占64位。其二进制存储格式遵循IEEE754标准。以float为例:
符号位:正数为0,负数为1。以float型数据123.456为例,分析其二进制存储格式。首先将十进制数123.456转换为二进制数为:1111011. 01110100101111001 (其中0.456如何转换为二进制?不断乘以2…)。1111011. 01110100101111001 即1. 11101101110100101111001乘以2的6次方。首先这是一个正数,则符号位为0。阶码为6,不过要转换成移码(计算机移码就是在原有的补码的基础上对于符号取反。对于8位存储数字,例如:-1的补码是11111111,它的移码就是01111111),6的移码为10000101。尾数则为1. 11101101110100101111001的小数部分,即11101101110100101111001。所以123.456的二进制存储格式为:0 10000101 11101101110100101111001
没错,大家的都是对的.
你用的是小端模式十六进制表示的吧.
我在后面一位有效数,还进行了0舍1入....
(改了下回答)
参考下面的链接
http://www.cnblogs.com/zhaoyl/archive/2012/04/21/2462409.html
http://stackoverflow.com/questions/2377733/how-does-this-program-work/2377772#2377772
还不明白的话,用下面的程序测试:
#include <stdio.h>
int main(int argc, char *argv[])
{
float a = 3.6;
double aa = (double)a;
printf("a = %d, 0x%x\n", a, a);
printf("aa = 0x%llx\n", *((long long unsigned int *)&aa));
printf("aa = %d\n", aa);
return 0;
}
输出:
a = -1073741824, 0x400ccccc
aa = 0x400cccccc0000000
aa = -1073741824
其实你的问题的原因就是,c标准规定可变参数函数(printf)传参时,float要转成double,a转成double后的aa 为 0x400ccccc c0000000,而printf收到 0x400ccccc c0000000这个参数时由于输出%d只需要4字节,所以就把低4字节0xc0000000作为参数输出了,所以你看到的就是一个负数。
用下面的代码可以测试输出高4字节,(注意只传了一个参数,输出两个数)
printf("a = %d, %d\n", a);
0xc0000000 输出的是一个正数.
0xc0000000 很明显是个负数,就是-1073741824
这个可能是编码的问题,不同的有不同的结果。
管你毛事,滚.不回答还在啰嗦,欠操!