C/C++中, 浮点数,float以及 double 在内存中是怎样存储的?
假如,我有32-bit
对于整形int,我们可以很快得出,这是 int i = 15的内存形式。
假设,最低位的bit的位权为-1,最高位为30。 那么这个就不再表示数字15了,而是
2^-1+2^0+2^1+2^2 = 7.5 了。
当然,上面只是假设,那么真正的Float 浮点型 在内存中是什么样子的呢?
首先需要知道的是 float 在内存中 占 32-bit double型 占 64-bit。
浮点型 在内存中,有3部分构成。
- Sign bit
- Exponent (指数)
- Mantissa(尾数,有效数字)
sign bit
是指浮点数在内存中的 最高位,0 表示 正数,1 表示负数。Sing bit 在浮点数float,32-bit内存中,占 1-bit 。
Exponent
指数,比如 10^5,2^6,这两个数的 5,6既是exponent。当然,数字在内存中都是以2进制体现的,所以这里的指数,是指以2为底 的指数。比如
很容易可以知道 Exponent为 6,在表示浮点数的内存中,表示的是 2^6 = 64。
Expoent 在 Float 32-bit的内存中,占8-bit,在这里把此8-bit视为表示unsigned int 的bit pattern。那么可以表示的范围是0~256的整数(指数范围), 但是指数既可以为正整数,也可以为负整数,这样以来无法表示-1,-2....这样的负整数了,所以
IEEE Standard 754 Floating-Point 对此引入了Bias, 偏移量的概念,对于Float型,此偏移量为127. 也就是说
127 这个数字已经被存储到 Exponent这个部分中了,像之前的那个例子,
表示的是指数6,但是在float内存结构中,其实表示的是 (6-127)= -121。需要减去已存入的偏移量 127。
假如 2^(1),指数1在float 的内存结构中的 bit pattern是什么样子的?
那会不会就是简单的
应该是 exponent - 127 = 1;(2^(1)中的指数1是这样得来的)
exponent = 127+1 = 128.(2^(1)中的指数1,在float内存结构中应该是128的bit pattern才对)
这只是个例子,帮助理解exponent,不会真的问这样的问题。。。。
Double型,需要占用64-bit 内存空间。同样,也是由 Sign bit,Exponent,Mantissa 3部分构成,不过 Exponent部分,在整个64-bit中 要占到 11-bit。此外偏移量 为1023。
Mantissa
Mantissa 尾数部分,
在float的32-bit的内存空间中,占到23-bit注意之前说的exponent 指数,最低位是从0开始的,那么Mantissa,尾数的最高位当然是 -1了。
那么大家说下,上面的尾数部分在 float 浮点数的内存中,表示多少? 很快可以得到是
2^(-2)+2^(-3) = 0.375。 有错了,应该是1.375。
大家回想下小学学的 科学记数法,5 = 5.0*10^0 , 0.75 = 7.5*10^(-1)。对吧?
在Float的内存表示中,这23-bit的尾数 仅仅表示 科学记数法 中 非零实数小数点后的精度。 换句话说,
Mantissa 包括两部分,一个是leading bit(科学记数法的非零实数),另一个是fraction bits(即精度),此23-bit仅仅表示的是 fraction bits。而在二进制中,非零实数自然是1了,所以leading bit默认是1了。所以上述表格实际上是表示
引用
这也就是为什么,在float的内存中,尾数部分可以用23-bit pattern 来表示出24-bit的不同数字了。
在Double型的 64-bit 内存结构中,尾数部分要占到52-bit。
我们用个表格来表示 在内存中,float是怎样存储的。
+/-Sign Exponent 指数 Fraction bit -> .f s | <---------------- 8 ----------------> | <-------------------------------------------- 23----------------------------------------------> |
Unsigned int 2^(-1), 2^(-2), 2^(-3)............
上面这个表格所要 表示的是如下的浮点数
(-1)^s * 1.f * 2^(Exponent-127)
随手写了个32-bit pattern,
0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
2^8 2^0 2^-23
假如告诉你,这是一个浮点型的内存结构,那么这个浮点数是多少呢?
这个浮点数可以很快的得到 (-1)^0*1.(2^-2+2^-3)*2^(2^1+2^2+2^4-127)。
以上是对Float double 型的内存结构的分析,前面
http://chuansu.iteye.com/blog/1484742 提到了int short char之间的相互转化,那么Float Double与int的转化又会发生什么?
未完-待续
分享到:
相关推荐
字符型数据在内部以ASCII码形式存储,C/C++中的字符型数据在运算时会被转换为整型数进行处理。 **字符常数表示**: - 直接用单引号括起来的字符,如`'a'`。 - 使用字符的ASCII码值表示,如`\101`代表`'E'`。 字符...
C、C++语言是IT行业的主流编程语言,也是很多程序员必备的软件基本功,是软件开发行业招聘考查的重点。本书以流行的面试题讲解为主要内容,介绍了C、C++语言基本概念,包括保留字、字符串、指针和引用、结构体、...
《C/C++ Reference》是一个非常重要的资源,对于学习和深入理解C和C++这两种编程语言至关重要。这份参考手册详尽地涵盖了C++的所有基础知识以及高级特性,为开发者提供了全面的指导。 C++是一种静态类型的、编译式...
对于整数类型的变量,在C/C++中,如果使用两个字节来存储整数,则最大十进制数值为: - 无符号整数 (unsigned): `2^16 - 1 = 65535` - 有符号整数 (signed): `-2^15` 到 `2^15 - 1`,即 `-32768` 到 `32767` 因此,...
C++则是C语言的扩展,引入了面向对象编程的概念,同时保持了C的许多特性。这两者都是软件开发中不可或缺的部分,尤其在系统级编程、游戏开发、嵌入式系统以及高性能计算等领域应用广泛。 在《C/C++ 语言参考》中,...
1. **基本语法与数据类型**:C/C++提供了丰富的数据类型,如整型(int)、浮点型(float, double)、字符型(char)等。了解它们的取值范围和运算规则是编程的基础。 2. **变量与常量**:变量是存储数据的容器,...
**标签**:C C++ C语言 **部分内容概述**: 1. **基础概念**:包括类型、变量、表达式和语句等。 2. **进阶主题**: - C语言:函数、编译过程、预处理器、指针、结构体等。 - C++语言:引用、重载、命名空间、C/...
2. **基本语法**:C/C++的语法基础包括变量声明、数据类型(如int、char、float等)、运算符(算术、比较、逻辑等)、控制结构(if-else、switch-case、for、while循环等)。 3. **指针**:C/C++的一个重要特性是...
标题 "Bezier_c/C++_" 暗示了我们即将探讨的是关于C或C++编程语言中的贝塞尔曲线(Bezier Curve)实现。贝塞尔曲线是一种在计算机图形学中广泛使用的数学模型,它允许我们平滑地定义和绘制曲线,特别是在2D和3D图形...
1. **变量与数据类型**:C/C++中的基本数据类型包括整型(int)、浮点型(float/double)、字符型(char)等。理解各种数据类型的存储大小和范围对于编写高效代码至关重要。 2. **运算符与表达式**:C/C++支持多种...
C/C++语言是计算机编程领域中的基础且强大的工具,它们被广泛应用于系统编程、软件开发、游戏引擎、嵌入式系统、高性能计算等多个领域。本文将深入探讨C和C++这两种语言的核心概念、语法特点以及它们的应用场景。 ...
- **指针**:指针是C/C++中的一个重要概念,它存储的是另一个变量的地址。 #### 1.2 控制结构 - **条件语句**:if...else、switch...case等。 - **循环结构**:for、while、do...while等。 - **跳转语句**:break、...
在计算机领域,C语言和C++是两种非常基础且重要的编程语言,尤其在教育和考试体系中占据着重要地位。计算机二级考试中的C语言部分,旨在考察考生对基本语法、数据类型、控制结构、函数、数组、指针等核心概念的理解...
### C/C++常用模板知识点详解 #### 一、标准输入输出库 `stdio.h` ##### 字符输入输出 1. **`getchar()`**: 用于读取单个字符,直到用户按下回车键才会继续执行程序。例如: ```c++ char a; a = getchar(); // ...
1. **基础语法与数据类型**:蓝桥杯的初级题目通常会涉及C++的基础语法,如变量声明、数据类型(int、char、float、double等)、运算符优先级、流程控制语句(if-else、switch-case、for、while等)。理解和熟练运用...
《C/C++课程设计教程——深入理解指针》 在C++编程中,指针是不可或缺的一部分,它提供了对内存空间直接访问的能力。本教程主要围绕指针的使用展开,让我们一起深入探讨指针的奥秘。 首先,我们了解内存空间的访问...
浮点数和双精度浮点数(Double)在计算机中以二进制形式存储,而字节数组是数据在内存或磁盘上最常见的表示方式之一。在进行跨平台通信或者序列化时,通常需要将浮点数和Double转换为字节数组,反之亦然。这种转换...
C/C++的浮点数在内存中的存储方式分析 任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100。则在Intel CPU架构的系统中,存放方式为 10000100(低地址单元) ...