C语言 打印和查看浮点flaot的二进制表示

前言

看了点博客, 浮点型数据的存储方式基本了解了, 感觉还是要详细打印出来才能彻底理解, 这里简单的打印所有可能的浮点模式, 帮助理解

例程

#include <stdio.h>

void displayBits32(unsigned value) {
	unsigned c;
	unsigned displayMask = 1 << 31;

	for(c=1;c<=32;c++) {
    if(c == 1) {
      printf(" S=");
    }
    else if(c == 2) {
      printf(" E=");
    }
    else if(c == 10) {
      printf(" M=1."); // M里开头的1是不会存储的, 这里补上
    }

		putchar(value & displayMask ? '1' : '0');
    value <<= 1;
	}
}

int main(int argc, char **argv) 
{
  float f = 5.999999;
  unsigned *a = (unsigned *)&f;
  f= 5.000000;
  displayBits32(*a); printf(" %f\n", f);
  f= 5.000001;
  displayBits32(*a); printf(" %f\n", f);
  f= 5.000002;
  displayBits32(*a); printf(" %f\n", f);
  f= 5.000003;
  displayBits32(*a); printf(" %f\n", f);
  f= 5.000004;
  displayBits32(*a); printf(" %f\n", f);
  f= 5.000005;
  displayBits32(*a); printf(" %f\n", f);
  f= 5.000006;
  displayBits32(*a); printf(" %f\n", f);
  f= 5.000007;
  displayBits32(*a); printf(" %f\n", f);
  f= 5.000008;
  displayBits32(*a); printf(" %f\n", f);
  f= 5.000009;
  displayBits32(*a); printf(" %f\n", f);
  f= 5.000010;
  displayBits32(*a); printf(" %f\n", f);
  putchar('\n');
  f= 5.999990;
  displayBits32(*a); printf(" %f\n", f);
  f= 5.999991;
  displayBits32(*a); printf(" %f\n", f);
  f= 5.999992;
  displayBits32(*a); printf(" %f\n", f);
  f= 5.999993;
  displayBits32(*a); printf(" %f\n", f);
  f= 5.999994;
  displayBits32(*a); printf(" %f\n", f);
  f= 5.999995;
  displayBits32(*a); printf(" %f\n", f);
  f= 5.999996;
  displayBits32(*a); printf(" %f\n", f);
  f= 5.999997;
  displayBits32(*a); printf(" %f\n", f);
  f= 5.999998;
  displayBits32(*a); printf(" %f\n", f);
  f= 5.999999;
  displayBits32(*a); printf(" %f\n", f);
  putchar('\n');
  f= -5.000000;
  displayBits32(*a); printf(" %f\n", f);
  f= -5.000001;
  displayBits32(*a); printf(" %f\n", f);
  f= -5.000002;
  displayBits32(*a); printf(" %f\n", f);
  f= -5.000003;
  displayBits32(*a); printf(" %f\n", f);
  f= -5.000004;
  displayBits32(*a); printf(" %f\n", f);
  f= -5.000005;
  displayBits32(*a); printf(" %f\n", f);
  f= -5.000006;
  displayBits32(*a); printf(" %f\n", f);
  f= -5.000007;
  displayBits32(*a); printf(" %f\n", f);
  f= -5.000008;
  displayBits32(*a); printf(" %f\n", f);
  f= -5.000009;
  displayBits32(*a); printf(" %f\n", f);
  f= -5.000010;
  displayBits32(*a); printf(" %f\n", f);
  putchar('\n');
  f= -5.999990;
  displayBits32(*a); printf(" %f\n", f);
  f= -5.999991;
  displayBits32(*a); printf(" %f\n", f);
  f= -5.999992;
  displayBits32(*a); printf(" %f\n", f);
  f= -5.999993;
  displayBits32(*a); printf(" %f\n", f);
  f= -5.999994;
  displayBits32(*a); printf(" %f\n", f);
  f= -5.999995;
  displayBits32(*a); printf(" %f\n", f);
  f= -5.999996;
  displayBits32(*a); printf(" %f\n", f);
  f= -5.999997;
  displayBits32(*a); printf(" %f\n", f);
  f= -5.999998;
  displayBits32(*a); printf(" %f\n", f);
  f= -5.999999;
  displayBits32(*a); printf(" %f\n", f);
  putchar('\n');
  f= 0.000000;
  displayBits32(*a); printf(" %f\n", f);
  f= 0.000001;
  displayBits32(*a); printf(" %f\n", f);
  f= 0.000002;
  displayBits32(*a); printf(" %f\n", f);
  f= 0.000003;
  displayBits32(*a); printf(" %f\n", f);
  f= 0.000004;
  displayBits32(*a); printf(" %f\n", f);
  f= 0.000005;
  displayBits32(*a); printf(" %f\n", f);
  f= 0.000006;
  displayBits32(*a); printf(" %f\n", f);
  f= 0.000007;
  displayBits32(*a); printf(" %f\n", f);
  f= 0.000008;
  displayBits32(*a); printf(" %f\n", f);
  f= 0.000009;
  displayBits32(*a); printf(" %f\n", f);
  f= 0.000010;
  displayBits32(*a); printf(" %f\n", f);
  putchar('\n');
  f= 0.999990;
  displayBits32(*a); printf(" %f\n", f);
  f= 0.999991;
  displayBits32(*a); printf(" %f\n", f);
  f= 0.999992;
  displayBits32(*a); printf(" %f\n", f);
  f= 0.999993;
  displayBits32(*a); printf(" %f\n", f);
  f= 0.999994;
  displayBits32(*a); printf(" %f\n", f);
  f= 0.999995;
  displayBits32(*a); printf(" %f\n", f);
  f= 0.999996;
  displayBits32(*a); printf(" %f\n", f);
  f= 0.999997;
  displayBits32(*a); printf(" %f\n", f);
  f= 0.999998;
  displayBits32(*a); printf(" %f\n", f);
  f= 0.999999;
  displayBits32(*a); printf(" %f\n", f);
  putchar('\n');
  f= -0.000000;
  displayBits32(*a); printf(" %f\n", f);
  f= -0.000001;
  displayBits32(*a); printf(" %f\n", f);
  f= -0.000002;
  displayBits32(*a); printf(" %f\n", f);
  f= -0.000003;
  displayBits32(*a); printf(" %f\n", f);
  f= -0.000004;
  displayBits32(*a); printf(" %f\n", f);
  f= -0.000005;
  displayBits32(*a); printf(" %f\n", f);
  f= -0.000006;
  displayBits32(*a); printf(" %f\n", f);
  f= -0.000007;
  displayBits32(*a); printf(" %f\n", f);
  f= -0.000008;
  displayBits32(*a); printf(" %f\n", f);
  f= -0.000009;
  displayBits32(*a); printf(" %f\n", f);
  f= -0.000010;
  displayBits32(*a); printf(" %f\n", f);
  putchar('\n');
  f= -0.999990;
  displayBits32(*a); printf(" %f\n", f);
  f= -0.999991;
  displayBits32(*a); printf(" %f\n", f);
  f= -0.999992;
  displayBits32(*a); printf(" %f\n", f);
  f= -0.999993;
  displayBits32(*a); printf(" %f\n", f);
  f= -0.999994;
  displayBits32(*a); printf(" %f\n", f);
  f= -0.999995;
  displayBits32(*a); printf(" %f\n", f);
  f= -0.999996;
  displayBits32(*a); printf(" %f\n", f);
  f= -0.999997;
  displayBits32(*a); printf(" %f\n", f);
  f= -0.999998;
  displayBits32(*a); printf(" %f\n", f);
  f= -0.999999;
  displayBits32(*a); printf(" %f\n", f);
  return 0;
}

运行结果和说明

 S=0 E=10000001 M=1.01000000000000000000000 5.000000          // S=0 表示正数
 S=0 E=10000001 M=1.01000000000000000000010 5.000001          // E 要减去127表示指数 这里是 E=2
 S=0 E=10000001 M=1.01000000000000000000100 5.000002          // M 表示值 1.01 指数 2 就是5 小数位看规律也很好理解, 似乎多了一位
 S=0 E=10000001 M=1.01000000000000000000110 5.000003
 S=0 E=10000001 M=1.01000000000000000001000 5.000004
 S=0 E=10000001 M=1.01000000000000000001010 5.000005
 S=0 E=10000001 M=1.01000000000000000001101 5.000006
 S=0 E=10000001 M=1.01000000000000000001111 5.000007
 S=0 E=10000001 M=1.01000000000000000010001 5.000008
 S=0 E=10000001 M=1.01000000000000000010011 5.000009
 S=0 E=10000001 M=1.01000000000000000010101 5.000010

 S=0 E=10000001 M=1.01111111111111111101011 5.999990
 S=0 E=10000001 M=1.01111111111111111101101 5.999991
 S=0 E=10000001 M=1.01111111111111111101111 5.999992
 S=0 E=10000001 M=1.01111111111111111110001 5.999993
 S=0 E=10000001 M=1.01111111111111111110011 5.999994
 S=0 E=10000001 M=1.01111111111111111110110 5.999995
 S=0 E=10000001 M=1.01111111111111111111000 5.999996
 S=0 E=10000001 M=1.01111111111111111111010 5.999997
 S=0 E=10000001 M=1.01111111111111111111100 5.999998
 S=0 E=10000001 M=1.01111111111111111111110 5.999999

 S=1 E=10000001 M=1.01000000000000000000000 -5.000000        // S=1 表示负数
 S=1 E=10000001 M=1.01000000000000000000010 -5.000001
 S=1 E=10000001 M=1.01000000000000000000100 -5.000002
 S=1 E=10000001 M=1.01000000000000000000110 -5.000003
 S=1 E=10000001 M=1.01000000000000000001000 -5.000004
 S=1 E=10000001 M=1.01000000000000000001010 -5.000005
 S=1 E=10000001 M=1.01000000000000000001101 -5.000006
 S=1 E=10000001 M=1.01000000000000000001111 -5.000007
 S=1 E=10000001 M=1.01000000000000000010001 -5.000008
 S=1 E=10000001 M=1.01000000000000000010011 -5.000009
 S=1 E=10000001 M=1.01000000000000000010101 -5.000010

 S=1 E=10000001 M=1.01111111111111111101011 -5.999990
 S=1 E=10000001 M=1.01111111111111111101101 -5.999991
 S=1 E=10000001 M=1.01111111111111111101111 -5.999992
 S=1 E=10000001 M=1.01111111111111111110001 -5.999993
 S=1 E=10000001 M=1.01111111111111111110011 -5.999994
 S=1 E=10000001 M=1.01111111111111111110110 -5.999995
 S=1 E=10000001 M=1.01111111111111111111000 -5.999996
 S=1 E=10000001 M=1.01111111111111111111010 -5.999997
 S=1 E=10000001 M=1.01111111111111111111100 -5.999998
 S=1 E=10000001 M=1.01111111111111111111110 -5.999999

 S=0 E=00000000 M=1.00000000000000000000000 0.000000
 S=0 E=01101011 M=1.00001100011011110111101 0.000001        // E = -20, M 里 1. 后面的舍去
 S=0 E=01101100 M=1.00001100011011110111101 0.000002        // E = -19, M 里 1.0 右面的舍去
 S=0 E=01101100 M=1.10010010101001110011100 0.000003        // E = -19, M 里 1.1 右面的舍去
 S=0 E=01101101 M=1.00001100011011110111101 0.000004
 S=0 E=01101101 M=1.01001111100010110101100 0.000005
 S=0 E=01101101 M=1.10010010101001110011100 0.000006
 S=0 E=01101101 M=1.11010101110000110001011 0.000007
 S=0 E=01101110 M=1.00001100011011110111101 0.000008
 S=0 E=01101110 M=1.00101101111111010110101 0.000009
 S=0 E=01101110 M=1.01001111100010110101100 0.000010

 S=0 E=01111110 M=1.11111111111111101011000 0.999990
 S=0 E=01111110 M=1.11111111111111101101001 0.999991
 S=0 E=01111110 M=1.11111111111111101111010 0.999992
 S=0 E=01111110 M=1.11111111111111110001011 0.999993
 S=0 E=01111110 M=1.11111111111111110011011 0.999994
 S=0 E=01111110 M=1.11111111111111110101100 0.999995
 S=0 E=01111110 M=1.11111111111111110111101 0.999996
 S=0 E=01111110 M=1.11111111111111111001110 0.999997
 S=0 E=01111110 M=1.11111111111111111011110 0.999998
 S=0 E=01111110 M=1.11111111111111111101111 0.999999

 S=1 E=00000000 M=1.00000000000000000000000 -0.000000
 S=1 E=01101011 M=1.00001100011011110111101 -0.000001     // 同上 
 S=1 E=01101100 M=1.00001100011011110111101 -0.000002
 S=1 E=01101100 M=1.10010010101001110011100 -0.000003
 S=1 E=01101101 M=1.00001100011011110111101 -0.000004
 S=1 E=01101101 M=1.01001111100010110101100 -0.000005
 S=1 E=01101101 M=1.10010010101001110011100 -0.000006
 S=1 E=01101101 M=1.11010101110000110001011 -0.000007
 S=1 E=01101110 M=1.00001100011011110111101 -0.000008
 S=1 E=01101110 M=1.00101101111111010110101 -0.000009
 S=1 E=01101110 M=1.01001111100010110101100 -0.000010

 S=1 E=01111110 M=1.11111111111111101011000 -0.999990
 S=1 E=01111110 M=1.11111111111111101101001 -0.999991
 S=1 E=01111110 M=1.11111111111111101111010 -0.999992
 S=1 E=01111110 M=1.11111111111111110001011 -0.999993
 S=1 E=01111110 M=1.11111111111111110011011 -0.999994
 S=1 E=01111110 M=1.11111111111111110101100 -0.999995
 S=1 E=01111110 M=1.11111111111111110111101 -0.999996
 S=1 E=01111110 M=1.11111111111111111001110 -0.999997
 S=1 E=01111110 M=1.11111111111111111011110 -0.999998
 S=1 E=01111110 M=1.11111111111111111101111 -0.999999
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
C语言中,二进制浮点型乘除计算可以使用相应的运算符来完成。 对于二进制数的乘法和除法,可以使用位运算符进行计算。二进制数的乘法可以使用左移运算符(<<)来实现。例如,将一个二进制数向左移动n位,相当于将该数乘以2的n次方。二进制数的除法可以使用右移运算符(>>)来实现。例如,将一个二进制数向右移动n位,相当于将该数除以2的n次方。这些运算符可以在C语言中直接使用,提供了方便的二进制乘除计算的方式。 对于浮点型数的乘法和除法,可以使用乘法运算符(*)和除法运算符(/)来进行计算。C语言中的浮点型数通常使用float、double或long double类型来表示。这些数值类型支持浮点数的乘法和除法操作。使用乘法运算符将两个浮点型数相乘,会得到它们的乘积。使用除法运算符将一个浮点型数除以另一个浮点型数,会得到它们的商。这些运算符在C语言中提供了方便的浮点型乘除计算的方式。 需要注意的是,在进行浮点型数的乘法和除法计算时,可能会出现精度丢失的情况。这是因为浮点数在计算机中以二进制形式存储,并且无法精确表示一些十进制小数。因此,在进行浮点型数的乘除计算时,应该注意精度问题,并尽可能使用适当的方式进行处理,以避免计算结果的错误。 总之,在C语言中,可以使用位运算符进行二进制数的乘除计算,可以使用乘法和除法运算符进行浮点型数的乘除计算。对于浮点型计算,需要注意精度问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Potcutre

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值