定点数和浮点数

本文中所提到的都是基于intel x86Cpu,开发环境是基于windows 10 + vs2019。本片博客需要读者自己明白十进制、十六进制、二进制之间的转换,文中不会介绍转换过程,需要了解详细过程的情查找相关资料

首先我们简单的介绍一下计算机中数据存储的基础知识,具体内容在大学课程《计算机组成原理》中有详细的介绍。计算机中对数据的存储是有两种形式,一种是以定点数方式存储即C/C++中的char、short、int、long、longlong,另一种就是以浮点数的方式存储即C/C++中的float、double。

定点数中char、short、int、long、longlong存储原理都是一样的,只是长度不同,所以我们选取int型详细介绍,浮点数中float、double原理也是一样的.

其中,定点数和浮点数都是最高位表示符号位(0表示正数1表示负数)其余位表示数值,字节是倒叙存数(小端模式)的也就是说高字节在左边低字节在右边。

定点数

定点数比较简单,计算机中存储的是真实值,计算机采用4字节(32位)存储int变量,例如:int value = 1 ; 则value转化成二进制0000 0000 0000 0000 0000 0000 0000 0001为了书写方便我们写成16进制形式为00 00 00 01。由于计算机是倒叙存储所以计算机中存储为01 00 00 00。

浮点数

下面介绍一下浮点数float存储,C/C++中float存储标准是基于IEEE754,具体内容是一个数值,可以使用科学计数法方式表示,即可以写成:

A * 2^n

其中A为尾数,2为底数,n为指数。

由于底数为2所以所有A都是大于1小于2,也就是都可以写成1.xxxx*2的n次方,所以计算机为了节省空间,可以不存储整数部分的1,因为所有的浮点数都有那个1我们转换的时候把那个1算进去就可以了。n可以是正数也可以是负数(float需要加上127,double加上1023)。

浮点数的存储是由符号位 (sign) + 指数位 (exponent) + 小数位 (fraction) 组成。

类型

符号位

指数

尾数

Float

1位(第31位)

8位(第23~30位)

23位(第0~22位)

Double

1位(第63位)

11位(第52~62位)

52位(第0~51位)

例如:float value = 12.5 ; 那么

定点数 浮点数

小数转二进制方法:整数部分采用除 2 取余,小数部分采用乘 2 取整法

float计算机存储(小端模式)即00 00 48 41

double计算机存储(小端模式)即  00 00 00 00 00 00 29 40

查看内存验证结果

#include

int main(){

float a = 12.5;

float* p = &a;

double b = 12.5;

double* pb = &b;

printf("%d\n", a);

printf("%d\n", (int)a);

printf("%d\n", *(int*)&a);

return 0;

}

通过断点查看变量a,b的地址,通过地址用内存查看器查看对应的内存来验证

VS2019运行至断点时,菜单调试->窗口->内存->内存1

double

内存是不会骗人的,所以结果验证无误

大端小端

大端模式:指数据的高字节保存在内存的高地址

例如:12345( 0x3039 ) 的存储顺序是 0x30、0x39

小端模式:指数据的高字节保存在内存的低地址

例如:12345( 0x3039 ) 的存储顺序是 0x39、0x30

判断大小端

方法一:

#include

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

int i = 0x12345678;

char c = i;

if (c == 0x78)

{

printf("小端\n");

}

else

{

printf("大端\n");

}

return 0;

}

方法二:

#include

int main(void){

int a = 0x12345678;

char *p = (char *)&a;

if (0x78 == *p)

{

printf("小端\n");

}

else

{

printf("大端\n");

}

return 0;

}

方法三:

#include

typedef union NODE

{

int i;

char c;

}Node;

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

Node node;

node.i = 0x12345678;

if (0x78 == node.c)

{

printf("小端\n");

}

else

{

printf("大端\n");

}

return 0;

}

上期第四题

#include

int main(){

float a = 12.5;

printf("%d\n", a);

printf("%d\n", (int)a);

printf("%d\n", *(int*)&a);

return 0;

}

printf("%d\n", a);

printf由于类型不匹配,所以,会把float直接转成double,double 8字节,12.5f转成十六进制:0x4029 0000 000 00000

计算机(小端模式下)存储的值为:00 00 00 00 00 00 29 40

而我们的%d要求是一个4字节的int,对于double的内存布局,我们可以看到前四个字节是00,所以输出自然是0了。

printf("%d\n", (int)a);

float强转成int,省略掉小数部分,所有为12

printf("%d\n",

(int)&a);

float 4个字节,12.5f转成二进制是:0100 0001 0100 1000 0000 0000 0000 0000,十六进制是:0x41480000,十进制是:1095237632。

上期第10题

题目回顾:

#include

int main(){

int a = 3, b = 5;

printf(&a["Ya!Hello! how is this? %s\n"], &b["junk/super"]);

//等价printf("Hello! how is this? %s\n", "super");

printf(&a["WHAT%c%c%c %c%c %c !\n"], 1["this"], 2["beauty"], 0["tool"], 0["is"], 3["sensitive"], 4["CCCCCC"]);

return0;

}

指针的另类用法:

char arr[20] = "hello world";

printf("%s\n", arr);//从&arr[0]地址处开始读取字符串到'\n'结束输出hello world

printf("%s\n", &arr[6]);//从&arr[6]地址处开始读取字符串到'\n'结束输出world

printf("%s\n", &6[arr]);//从&arr[6]地址处开始读取字符串到'\n'结束输出world

arr[i] 其实就是 *(arr+i)也就是 *(i+arr),这个属于语法规则,只是用的少。

printf(&a["Ya!Hello! how is this? %s\n"], &b["junk/super"]);

//等价printf("Hello! how is this? %s\n", "super");

在这里的"Ya!Hello! how is this? %s\n"是一个存储在常量区的字符串

char* p = "Ya!Hello! how is this? %s\n";

char* p1 = "junk/super";

printf(&a[p], &b[p1]);

printf(&p[3], &p1[5]);

这里的数字3,5就是地址的偏移量

verilog 浮点数转定点数_聊一聊定点数和浮点数的存储方式相关推荐

  1. java浮点数化为整数_[Java教程]javascript浮点数转换成整数三种方法

    [Java教程]javascript浮点数转换成整数三种方法 0 2014-06-24 04:00:27 将浮点数转换成整数方法有很多,分享三种常用方法. Summary 暂时我就想到3个方法而已.如 ...

  2. 数据存储方式_视频监控系统的数据存储方式的概念及应用

    DAS:直连存储,直连式存储与服务器主机之间的连接通常采用SCSI连接,SCSI通道是IO瓶颈;服务器主机SCSI ID资源有限,能够建立的SCSI通道连接有限.无论直连式存储还是服务器主机的扩展,从 ...

  3. verilog 浮点转定点_浮点数0.1+0.2为何不等于0.3

    来自公众号:印记中文 本文由扇贝的前端工程师景国凯撰写,跟随作者一起了解浮点数的计算过程,掌握为何会出现精度丢失的根本原因. 之前简单介绍了二进制下整数的加减乘除基本运算,建议没看过的先去了解一下,这 ...

  4. float、double(浮点数)区别还有和decimal(定点数)的比较

    一.三者的区别介绍 float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位) double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1. ...

  5. 计算机系统基础实验 - 同符号浮点数加法运算/无符号定点数乘法运算的机器级表示

    实验3 同符号浮点数加法运算/无符号定点数乘法运算的机器级表示 实验序号:3 实验名称:同符号浮点数加法运算/无符号定点数乘法运算的机器级表示 适用专业:软件工程 学 时 数:2学时 一.实验目的 1 ...

  6. python 浮点数精度丢失_浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源...

    浮点数精度问题透析:小数计算不准确+浮点数精度丢失根源 无论在java python javaScript里面都存在 1+ 2!== 3 问题,这个问题的产生根源在于计算存储数字是二进制,对无限循环小 ...

  7. python浮点数比较大小_浮点数的相等比较

    浮点数的相等比较 今天群里边一哥们儿--哦,确切地说,应该是一姊妹--问到了Python中怎样判断一个浮点数的小数部分是不是0,本意是要找和C语言中的fmod函数相同功能的函数的,在Python中在m ...

  8. 22.25在计算机中如何储存,浮点数在计算机中存储方式

    C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,我们在声明一个变量float f= ...

  9. python浮点数运算问题_python基础教程之. 浮点数运算:问题和局限

    14. 浮点数运算:问题和局限¶ 浮点数在计算机硬件中表示为以 2 为底(二进制)的小数.例如,十进制小数 0.125 是1/10 + 2/100 + 5/1000 的值,同样二进制小数 0.001 ...

最新文章

  1. 从系统的启动过程分析,为什么我们划分分区的时候 /sbin 、/bin、/lib、/dev不能做为独立的分区?...
  2. Scott用户的表结构
  3. 数据库性能优化—MySQL单表最大记录数超过多少时性能会严重下降
  4. Unity3d-跨平台(二)
  5. re:Invent大会第十年,亚马逊云科技推出了哪些底层自研技术
  6. Spring MVC异常处理 - @ ControllerAdvice,@ ExceptionHandler,HandlerExceptionResolver
  7. [ES6] 细化ES6之 -- 对象的扩展
  8. POJ 1065 Wooden Sticks(LIS,最少链划分)
  9. python画散点图-从零开始学Python【15】--matplotlib(散点图)
  10. 如何在Android模拟器中模拟GPS位置?
  11. 基于java的教材管理_基于JAVA Web教材管理系统设计与实现.doc
  12. 计算机原理名词,计算机组成原理 常用名词解释
  13. 接入微信SDK 获取用户定位
  14. PS制作华丽的紫色立体字
  15. 360云服务器关闭后,360云盘宣布关闭!7个问题回答告诉你关闭之后怎么办?
  16. 融云一站式「云市场」上线,携手生态伙伴,共建价值平台
  17. linux下添加JAVA_HOME环境变量
  18. Android平台移植FFmpeg和x264
  19. 【Simulink教程案例4】使用Simulink自带的模块实现PID控制器,并对比案例1的PID控制器
  20. 物联网硬件模拟软件 MqttEmu

热门文章

  1. 隆重推介:胡光超老师2022年度优秀中高项学员代表龙虎榜!
  2. 利用Python海龟绘图画一个世界杯的足球
  3. ORA-24811: 提供写入的数据少于指定的数据
  4. C语言time()函数的用法
  5. Word List 02
  6. vue+xlsx插件实现table表格的简单导出——技能提升
  7. [转载] 七龙珠第一部——第001话 布玛与孙悟空
  8. 免费又好用的屏幕录像/直播软件:Open Broadcaster Software
  9. Ubuntu下Hadoop的安装教程
  10. 搭建vmware虚拟化平台的基础配置,以及Hadoop平台的搭建