整数和浮点数的存储

1.数据类型

数据的类型有很多,不同的编程语言会将数据的类型分为不同的类别。但是一般的分类是两大类:基本数据类型和引用类型。

基本数据类型:直接存储数值。一般有:整型(byte / short / int / long)、浮点型(float / double)、布尔型(boolean)和字符型(char)。
自定义类型: struct,union,enum。

2.整数的基本概念

大家知道,整数包括负数,零,和正数。计算机中的整数分为有符号数和无符号数。

有符号数:最高位表示符号,即最高位为0,表示正数,最高位为1,表示负数。如果用N位来表示整数,那么有符号数的范围为:[-2^(N-1),(2 ^ (N-1) )-1]。用8位来表示有符号char整数数,由于第8位用于表示了符号,因此,有符号char 类型的表示范围为[-128,+127]。
无符号数:表示非负数,整个位数都用来表示整数的值。如果用N位来表示整数,无符号char的表示范围为[0,(2 ^ N)-1]。用8位来表示有符号整数数,则无符号char类型的表示范围为[0,255]。

原码,反码,补码

整数的编码分为原码、反码、和补码。计算里使用的是补码的存储方式。它们的定义如下:
正数 : 原码,反码,补码 都一样。

负数要另类讨论如下:

原码:在数值前面增加了一位符号位(即最高位为符号位),该位为0表示正数,该位为1表示负数,其余位表示数值的大小。

反码:正数的反码与其原码相同。负数的反码是对其原码逐位取反,但符号位除外。

补码:正数的补码与其原码相同,负数的补码就是对该负数的反码加1。

3.浮点数的存储

一般的编程语言都是将浮点类型的数据采用单精度类型( float)和双精度类型(double)来存储,float 数据占用 32bit,double 数据占用 64bit,我们在声明一个变量 float f= 2.25f; 的时候,是如何分配内存的呢?如果胡乱分配,那世界岂不是乱套了么,其实不论是 float 还是 double 在存储方式上都是遵从 IEEE 的规范的, float 遵从的是 IEEE R32.24 ,而 double 遵从的是 R64.53。无论是单精度还是双精度在存储中都分为三个部分:

浮点数表示的数值:V = (-1) ^ s × M × 2 ^ E

符号(sign) :1个bit表示,当s=0,V为正数;当s=1,V为负数。

阶码(exponent) :E的作用是对浮点数加权,用于存储科学计数法中的指数数据,并且采用移位存储。float类型的阶码是 8 bits,double类型的阶码是 11 bits。

尾数(significand) :M是一个二进制小数,因为是二进制,所以科学计数法中这个值范围是:1≤M<2。(和十进制中范围为1~10一样)

因为E在存储时是无符号数所以,在碰见负的次方时,通常计算机在存储时都加一个中间值 (float) : +127,(double) : +1023

再拿出的时候会在减去一个(float)-127 ,(double)-1023

那拿出的时候会碰见3种情况

不全为0或不全为1

跟上面说的是一样的

全为0

相当于一个接近于0的数,无穷小
获得真实值时会用1去减中间值,如(float)1 - 127
(double) 1 - 1023

全为1

会变一个无穷大的一个数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值