float 和 double 类型数据在内存中的存储方法

无符号整型采用32位编码,带符号整型数采用1个符号位31位底数编码;

单精度数据采用了1位符号位,8位阶码,23位尾数的编码;

双精度数据采用了1位符号位,10位阶码,52位尾数的编码;

无符号整型的范围:0~2的32次方

带符号整型:-2的31次方~2的31次方

单精度规定用 8 位二进制表示阶数,即最大表示为 2 的 128 次方,把这个数算出来是 3.4028236692093846346337460743177e+38

双精度规定用 11 位二进制表示阶数,即最大表示为 2 的 1024 次方,结果是 1.797693134862315907729305190789e+308

浮点数(单精度的 float 和双精度的 double)在内存中以二进制的科学计数法表示,表达式为 N = 2^E * F;

其中E为阶码(采用移位存储),F 为尾数。

float 和 double 都由符号位、阶码、尾数三部分组成,float 存储时使用 4 个字节,double 存储时使用 8 个字节。

各部分占用位宽如下所示:

符号位     阶码      尾数     长度

float              1           8         23      32

double          1         11        52      64

符号位:0代表正数,1代表负数。

阶码:用移位表示法存储科学计数法中的指数数据

float阶码占8位,取值范围-128~127,但并没有按照移位表示法+128,而是+127。

同理double要+1023。阶码也是指数位

尾数:用二进制的科学计数法表示后,去掉小数点前面恒定的1,只保留小数点后面的二进制数据,存入尾数位置即可。

比如8.25,二进制科学计数法表示为:1.00001*2^3,

具体转换方法:

8的二进制1000;

.25的二进制.01:即0*2^(-1) + 1*2^(-2)。

写为:1000.01,小数点左移3位,即转换完毕。

符号位确定:8.25为正数,符号位为0。

阶码的表示:阶码位3+127=130;二进制10000010,已经是8位。

尾数的表示:去掉小数点前面的1,为00001,后面补充0至23位:000 0100 0000 0000 0000 0000

最终8.25在内存里存储的二进制为:0100 0001  0000 0100  0000 0000  0000 0000

又比如11.4,二进制科学计数法表示:

float:1.01101100110011001100110 * 2^3

double:1.0110  1100 1100  1100 1100  1100 1100  1100 1100  1100 1100  1100 1101 * 2^3

所以他们的值其实是不同的,因为.4用二进制无法精确表示

——这也就是为什么 float 类型数据 和 double 类型数据 都存储11.4,但是对比起来,他们不相等的原因。

比如 float a = 11.4; double b = 11.4; 要让他们正确对比,((float)b == a),让 double数据舍弃比 float 多的那些尾数。

对于 double 型数据,只要将阶码前面加0扩展到11位,尾数后面补充0至52位即可。

移位表示法:

在数 X 上加一个偏移量,常用于表示浮点数中的阶码(注意阶码的偏移量和移位表示法定义有差别)。

定义:

若 X为纯整数,X[移] = 2^(n-1) + X,-2^(n-1) <= X < 2^(n-1);

若X为纯小数,X[移] = 1 - X,-1<= X < 1

下面这个代码,我很喜欢,其中有很多思想,对我来说很有用,膜拜下某大神

#include

#define print_float(a) print_bitxx(a, 4)

#define print_int(a) print_bitxx(a, 4)

#define print_double(a) print_bitxx(a, 8)

intis_little_endian()

{short int x = 0x0001;return ((char*)&x)[0];

}void print_bitxx(const void *a, intbytes)

{const unsigned char *pos = (const unsigned char *)a;inti, j;intmax_i;

max_i= bytes - 1;if(is_little_endian())

{for(i=max_i; i>=0; i--)

{for(j=7; j>=0; j--)

{

printf("%d", ((pos[i] & (1 << j)) ? 1 : 0));if (j == 4 || j == 0)

printf(" ");

}

printf(" ");

}

}

printf("\n");

}int main(int argc, char **argv)

{int a = 8.25;float b = 8.25;double c = 8.25;

print_int(&a);

print_float(&b);

print_double(&c);

printf("%d\n", b == (float) c);

printf("%d\n", (double)b == (double) c);return 0;

}

然后就是我的学习时间了

1、编写程序把一个整型二进制数中 1 的个数,最高位1的位置和最低位1的位置显示出来。

程序接受用户输入的一个整数(分别正数一个,负数一个)

输出该整数,以及其中 1 的个数,最高位 1 的位置,最低位 1 的位置。

用GCC编译程序运行,检查程序运行是否正确。

/*编写程序

把一个整型二进制数中1的个数,最高位1的位置和最低位1的位置显示出来。

程序接受用户输入的一个整数(分别正数一个,负数一个),

输出该整数,

以及其中1的个数,

最高位1的位置,

最低位1的位置。

一个示例的输出如下

NUMBER: 2049

BITS: 2

HIGHEST 1: 11

LOWEST 1: 0

据实验:输入的数字范围是(-2^31) 到 (2^31 - 1)

-2147483648 到 2147483647

本代码移位运算测试,int 和unsigned int无区别*/#include

int main(int argc , char *argv[])

{int num = 0;inttmp;int count = 0;int highPos = -1;int lowPos = -1;int flag = 1;

printf("Input :");

scanf("%d" , &num);int i = 0;/*******************核心代码*********************/

while(i != 32)

{

tmp= num&(1<

{

highPos=i;

count++;if(flag)

{

lowPos=i;

flag= 0;

}

}

i++;

}/************************************************/printf("NUMBER: %d\n", num);

printf("BITS: %d\n", count);if(count >= 1)

{//如果有1

printf("HIGHEST 1: %d\n", highPos);

printf("LOWEST 1: %d\n", lowPos);

}else{//没有1

printf("HIGHEST 1: \n");

printf("LOWEST 1: \n");

}return 0;

}

2、编写程序把一个实型二进制数中 1 的个数,最高位 1 的位置 和 最低位 1 的位置 显示出来。

程序接受用户输入的一个整数(分别正数一个,负数一个)

输出该整数,以及其中1的个数,最高位1的位置,最低位1的位置。

用GCC编译程序运行,检查程序运行是否正确。

/*编写程序

把一个实型二进制数中1的个数,最高位1的位置和最低位1的位置显示出来。

程序接受用户输入的一个实型(分别正数一个,负数一个),

输出该实型,

以及其中1的个数,

最高位1的位置,

最低位1的位置。

root@kjf:/mnt/hgfs/workPlace/01_computer/20170914# ./a.out

Input : 8.25

NUMBER: 0100 0001 0000 0100 0000 0000 0000 0000

BITS: 3

HIGHEST 1: 30

LOWEST 1: 18*/#include

#define print_float(a) print_bitxx(a, 4) //访问对象地址,访问对象大小float为4字节

intcount;intposHex;inthighPos;intlowPos;inthighFlag;intlowFlag;//判断小端模式

intis_little_endian()

{short int x = 0x0001;return ((char*)&x)[0];

}//访问对象地址,访问对象大小float为4字节。。。打印存储的二进制数

void print_bitxx(const void *a, intbytes)

{intbit;const unsigned char *pos = (const unsigned char *)a;inti, j;intmax_i;

max_i= bytes - 1;if(is_little_endian())

{//此程序只适用小端模式,因为是根据指针访问存储数据

for(i=max_i; i>=0; i--)

{for(j=7; j>=0; j--)

{

bit= ((pos[i] & (1 << j)) ? 1 : 0);

printf("%d", bit);/************************************/

if(bit == 1)

{//如果是1

if(highFlag == 0)

{

highFlag= 1;

highPos=posHex;

}

lowPos=posHex;

count++;

}

posHex--;/************************************/

if (j == 4 || j == 0)

printf(" ");

}

printf(" ");

}

}

printf("\n");

}int main(int argc , char *argv[])

{float num = 0;/*************参数初始化************/count= 0;

posHex= 31;

highPos= -1;

lowPos= -1;

highFlag= 0;

lowFlag= 0;/***********************************/printf("Input :");

scanf("%f" , &num);/***********************************/printf("NUMBER:");

print_float(&num);

printf("BITS: %d\n", count);if(count >= 1)

{//如果有1

printf("HIGHEST 1: %d\n", highPos);

printf("LOWEST 1: %d\n", lowPos);

}else{//没有1

printf("HIGHEST 1: \n");

printf("LOWEST 1: \n");

}return 0;

}

c语言int转换为bytes,__c语言__整型、实型的存储(十进制转二进制)相关推荐

  1. c语言int转换为十六进制,C语言将int型数据转换为十六进制的字符串

    方法一: int i =0; char * inttohex(int aa,char *buffer) { if (aa < 16) //递归结束条件 { if (aa < 10) //当 ...

  2. 学生成绩排名及管理系统c语言,学生成绩管理系统__C语言版.doc

    学生成绩管理系统__C语言版 学生成绩管理系统__C语言版 #include #include #include #include #include #include using namespace ...

  3. c 语言整形转换为字符串,C 语言整数与字符串的相互转换

    一.简述 C 语言中整数与字符串的相互转换,有广泛应用的拓展函数(非标准库),也可以自己尝试简单的实现. 二.整数转字符串 1.拓展函数 itoa itoa (表示 integer to alphan ...

  4. c语言 int是signed,C语言的补码表示和unsigned及signed的的转换

    这东西实际编程时一直无视的,范围小了就换个大点的表示形式,但是总觉得基础知识还是掌握得好,免得到时候用移位运算或类型转换或笔试题时要花时间想. C语言的基本类型有char.int.float.doub ...

  5. c语言int转字符串_C语言零基础入门-指针-05

    C语言零基础入门-指针-05 本节要点: 1,字符指针. 2,字符串指针. 3,指针的参数传递 4,多重指针 01. 字符指针 这里的定义与前面的基本一样,所谓的字符指针就是这个指针指向的是一个字符型 ...

  6. c语言int x=3,C语言 设有 int x=11,则表示式((x++)*1/3)的值是几,为啥子

    C语言 设有 int x=11,则表示式((x++)*1/3)的值是几,为啥子以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下 ...

  7. C语言int search类型,C语言的一些高级议题

    指针是C语言的灵魂,我们经常听到这样的说法,当我们初学C语言的时候,似乎觉得也没有什么,但是当你越来越深入的了解它,你就会发现C语言的强大有时甚至超乎你的想象.C语言作为一种相对较为底层的语言,在某些 ...

  8. c语言int grade 5,C语言补考!!!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include struct student { int id; char name[20]; int grade; }student ...

  9. C语言字符串转换为整数(附完整源码)

    C语言字符串转换为整数 C语言字符串转换为整数完整源码 C语言字符串转换为整数完整源码 #include <assert.h> #include <stdio.h> #incl ...

  10. c语言tab什么意思_C语言入门学好这一篇就足够了!C语言所有的知识点

    全球最大的C/C++人员聚集地就在我这里,企鹅裙搜索直播编程学习,[14]就是我的.不管你是什么基础,来了就是兄弟,是兄弟就跟我一起学习C/C++!关注我,为编程点赞,每天学点小知识!工作需要学习C/ ...

最新文章

  1. 结构题直接定义赋值语句
  2. 懂外语、会创作,机器高质量学习挑战均在这里实现
  3. python爬虫换电脑不能运行_python爬虫程序运行失败,求原因
  4. Java中对象的复制
  5. Redhat 或 CentOS 发行版本号
  6. Nginx负载均衡状态之backup
  7. 【转】架构师Jack专访:全面认识软件测试架构师
  8. 汽车运输、影视动画、建筑施工,Unite 2019 看技术如何颠覆传统?
  9. 正则表达式之位置匹配
  10. 微型计算机安装调试维修中级题库,调试维修工中级题库(答案).doc
  11. Could not set property ‘XXX‘ of ‘class com.entity.XXX‘
  12. java手机号正则验证(中国手机号)
  13. 如何关闭 window10 自带的杀毒软件
  14. python dict添加key 和value_python迭代dict的key和value的方法
  15. WiFi密码忘记?电脑密码忘记?
  16. 建模贴图技巧,用起来6的飞起
  17. (数据库-MySQL)查看表的结构、表的创建过程、表
  18. Java SE 8: Lambda Quick Start
  19. Canvas入门篇(一)
  20. 使用微信开发工具制作一个简单的古诗词展示微信小程序

热门文章

  1. HTML如何设置四边形,css实现三角形和平形四边形
  2. 斩断***黑手:如何使用IceSword冰刃
  3. npm 如何处理依赖与依赖冲突
  4. 【U盘检测】为了转移压箱底的资料,买了个2T U盘检测仅仅只有47G~
  5. 制作QQ会员页面导航
  6. 只有管理得少,才能管理得好
  7. CANoe软件使用(一)——软件界面介绍
  8. 砍价永远差一刀?拼多多法庭上回复:小数点后有6位......
  9. 基于32feet.net对Broadcom(Widcomm)
  10. DAS Over FC 技术允许 ATTO 分解存储并完成 vSAN 认证套件