C语言打印补码--整型、浮点型

直接上代码,相对比较的看,没有简化,里面有很多问题没解决,请大家帮忙解决一下!

#include<stdio.h>
//打印补码
void print_buma(unsigned int *a,unsigned int flag)
{
	if(flag&1)
		printf("单精度浮点数:");
	printf("0x%08X\n", *a);
	for(int i=0;i<32;i++)
	{
		if(*a<<i&1<<31)
			printf("1");
		else
			printf("0");
	}	
	printf("\n");
	
	for(int i=0;i<32;i++)
	{
		if(i==0)    //第31位,也就是最高位 1位
			printf("符号位:");
		if(i==1&&flag&2)
			printf("\n数值域:");
		if(i==1&&flag&1)    //23-30   8位
			printf("\n指数域:");
		if(i==9&&flag&1)    //0-22   23位
			printf("\n尾 数:");	
		if(*a&1<<(31-i))  //与最高一位比较
			printf("1");
		else
			printf("0");
	}	
	printf("\n");
}

void print_buma_d(unsigned long *a)
{
	//unsigned long b=1<<63;   //   单写一个“1<<63”打印出来是0,  1<<32直接打印也是0,但1<<31就可以打印出数;所以我才使用unsigned long来存储
	printf("双精度浮点数:");
	printf("%ld\n",*a);
	// printf("%ld\n",b);   //为0  ??
	for(int i=63;i>=0;i--)
	{
		if(*a>>i&1)   //把要比较的最高位移动到最低位
			printf("1");
		else
			printf("0");	
	}
	printf("\n");
	
	for(int i=63;i>=0;i--)
	{
		if(i==63)   //63位 符号位
			printf("符号位:");
		if(i==62)  //52-62 11位
			printf("\n指数域:");
		if(i==51)    //0-51   52位
			printf("\n尾 数:");	
		
		if(*a>>i&1)   //把要比较的最高位移动到最低位
			printf("1");
		else
			printf("0");	
	}
	printf("\n");
}

void main_copy()
{
	int a=12,a0=-24;
	float b=123.4,b0=-123.4;
	double c=35.25,c0=-225.25;
	unsigned int *p1=&a;     //可以“不需要强制转换”
	unsigned int *p2=&a0;
	unsigned int *p3=&b;
	unsigned int *p4=&b0;
	unsigned long *p5=&c;
	unsigned long *p6=&c0;
	
	printf("%d\n",a);
	print_buma(p1,2);
	printf("\n");
	printf("%d\n",a0);
	print_buma(p2,2);
	printf("\n");
	printf("%f\n",b);
	print_buma(p3,1);
	printf("\n");
	printf("%f\n",b0);
	print_buma(p4,1);
	printf("\n");
	printf("%f\n",c);
	print_buma_d(p5);
	printf("\n");
	printf("%f\n",c0);
	print_buma_d(p6);
}

void main()
{
	int a=12,a0=-24;
	float b=123.4,b0=-123.4;
	double c=35.25,c0=-225.25;
	unsigned int *p1=(unsigned int *)&a;
	unsigned int *p2=(unsigned int *)&a0;
	unsigned int *p3=(unsigned int *)&b;
	unsigned int *p4=(unsigned int *)&b0;
	unsigned long *p5=(unsigned long *)&c;
	unsigned long *p6=(unsigned long *)&c0;
	
	printf("%d\n",a);
	print_buma(p1,2);
	printf("\n");
	printf("%d\n",a0);
	print_buma(p2,2);
	printf("\n");
	printf("%f\n",b);
	print_buma(p3,1);
	printf("\n");
	printf("%f\n",b0);
	print_buma(p4,1);
	printf("\n");
	printf("%f\n",c);
	print_buma_d(p5);
	printf("\n");
	printf("%f\n",c0);
	print_buma_d(p6);
	
	printf("\n\ncopy:\n");
	main_copy();
}

运行结果:两个函数一样,所以截取了copy的部分。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值