显示并分析浮点数在计算机内部的存放格式-------C语言实现

雪域迷影 2010-10-01 03:00:15
显示并分析浮点数在计算机内部的存放格式 要求用vc++编写程序实现显示功能,之后自己举例验证,分析格式,验证所列举的与实际显示的是否一致
...全文
188 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
雪域迷影 2010-10-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 nbda1121440 的回复:]
C/C++ code

#include <math.h>
#include <stdio.h>
#include <string.h>

void integerToBinary(char *output, int integer) //将整数integer转化为二进制并存放到output数组中
{
int buffer[100];
int i, j;
……
[/Quote]
很是强悍啊,貌似计算机在运算时对数据已经进行二进制处理了,
这里有一种更为简单的方法,就是根据IEEE 754标准将10进制数据转换为二进制数后保存在一个
32位int型数组(从低位到高位)中,然后反向输出结果即可。

C语言代码如下:

#include<stdio.h>
void Float(void *p)
{
long c;
int i,b[32];//存整数4个字节
c=*(long *)p;//p从空指针形式强制转换为long型 重要
for(i=0;i<32;i++)
{
b[i]=c&1;//通过空指针得到的一块数据,移位查看
c=c>>1;//右移
}
printf("y=");
for(i=31;i>=0;i--)
printf("%d",b[i]);
printf("\n");
}

int main()
{

float s;
scanf("%f",&s);
Float(&s);



}



比如输入-1会得到以下结果的:
-1
y=10111111100000000000000000000000
cguohua 2010-10-03
  • 打赏
  • 举报
回复
学习了
千杯不醉-sen 2010-10-02
  • 打赏
  • 举报
回复 1
受教了、、、
saishow 2010-10-02
  • 打赏
  • 举报
回复
标记一下.
周靖峰 2010-10-01
  • 打赏
  • 举报
回复

#include <math.h>
#include <stdio.h>
#include <string.h>

void integerToBinary(char *output, int integer) //将整数integer转化为二进制并存放到output数组中
{
int buffer[100];
int i, j;

for (i = 0; integer > 0; i++)
{
buffer[i] = integer % 2;
integer /= 2;
}
for (i = i - 1, j = 0; i >= 0; i--, j++)
{
output[j] = buffer[i] + '0';
}
output[j] = '\0';
}

void decimalToBinary(char *output, float decimal) //将小数decimal转化为二进制并存放到output数组中,数组容量至少100
{
int i;

for (i = 0; i < 99; i++)
{
decimal *= 2;
if (decimal > 1)
{
output[i] = '1';
decimal -= 1;
}
else
output[i] = '0';
}
output[99] = '\0';
}

int getOrder(char *output) //算出阶数,output为存二进制整数的数组
{
int len = strlen(output);
return (len - 1 + 127);
}

void orderToBinary(char *output, int order) //将阶数order转化为二进制并存放到output数组中,数据大小最多8位
{
int i, n;

integerToBinary(output, order);
n = strlen(output);
if (n == 8)
return;
else if (n < 8)
{
n = 8 - n;
for (i = 7; i >= 0; i--)
{
if (i < n)
output[i] = '0';
else
output[i] = output[i - n];
}
output[8] = '\0';
return;
}
else
{
n -= 8;
for (i = 0; i < 8; i++)
{
output[i] = output[i + n];
}
output[8] = '\0';
return;
}
}

void getMantissa(char *outputMantissa, char *outputInteger, char *outputDecimal) //求尾数
{
int i, n;

strcpy(outputMantissa, outputInteger + 1);
strcat(outputMantissa, outputDecimal);
n = strlen(outputMantissa);
if (n > 23)
{
outputMantissa[23] = '\0';
return;
}
else if (n == 23)
return;
else
{
for (i = 23 - n; i < 23; i++)
outputMantissa[i] = '0';
outputMantissa[23] = '\0';
return;
}
}

void change(char *output) //将二进制数转化为十六进制数
{
int i, j;
int t;

for (i = 0; i < 8; i++)
{
t = 0;
for (j = 0; j < 4; j++)
{
t = t * 2 + output[i * 4 + j] - '0';
}
if (0 <= t && t <= 9)
output[i] = t + '0';
else
output[i] = t - 10 + 'a';
}
output[8] = '\0';
}

int main()
{
char finalFloat[100] = "";
char outputInteger[100];
char outputDecimal[100];
char outputOrder[100];
char outputMantissa[200];
float f;
int flag = 0; //0为正数,1为负数

scanf("%f", &f);
if (f < 0)
{
flag = 1;
f = -f;
}
integerToBinary(outputInteger, (int)floor(f));
decimalToBinary(outputDecimal, f - floor(f));
orderToBinary(outputOrder, getOrder(outputInteger));
getMantissa(outputMantissa, outputInteger, outputDecimal);
if (flag == 0)
finalFloat[0] = '0';
else
finalFloat[0] = '1';
strcat(finalFloat, outputOrder);
strcat(finalFloat, outputMantissa);
change(finalFloat);
puts(finalFloat);

return 0;
}

这段代码是我根据IEEE浮点数转化规则写的,其中还是有很多bug(包括0显示不正常),不过用一般的数还是能算的结果的
至于要验证对错性,打开vc6随便写一段代码,比如:
int main()
{
float f;
scanf("%f", &f);
return 0;
}

然后单步运行,然后在工具栏(即有新建保存等按钮的那一栏)上右击,勾选memory选项,然后就能查看内存了,你可以记下f的地址,然后转到f的地址,再执行scanf("%f", &f);查看内存中f的存放情况,如果不出意外的话,我的程序显示的东西和内存中存放的数据是恰好相反的,这个我也不知道为什么,反正事实的确是这样的。

至于IEEE浮点符到底是怎么算的,你可以参考http://topic.csdn.net/t/20040118/18/2674990.html,他写的很不错,不过好像数据有些问题,但做法是正确的。

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧