不同类型数据的存储表示

引例

数据在计算机中的表示?
数值、音频、文本、视频、图形图像

==但最终这些数据都是存在计算机的内存里,或者说存在外部存储器磁盘里。

?那么数据在内存中又是如何存储的呢?

我们可以看到,计算机上的arduino控制板中
地址信号引脚(最基本单元)[又叫做一个位 bit]

它只能读取高电压和低电压两种信号。
即【0】或【1】;

而引脚的存储容量非常小,故人们将八位设为一个存储单元(Byte)

存储单元地址一个字节位 bit
00000/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1
00010/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1
00020/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1
00030/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1
00040/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1
00050/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1
00060/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1
00070/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1
00080/1 0/1 0/1 0/1 0/1 0/1 0/1 0/1

所以说要看内存就看有多少个存储单元。

内存容量常见换算
1 Byte = 8 bit1 KB=2^10 Byte
1 MB=2^10 KB1 GB=2^10 MB
1 TB=2^10 GB

文本数据表示-字符Char

128个字符,如何存储
-> 排序

从7个0开始排序标号0 0 0 0 0 0 0
0 0 0 0 0 0 0- > 1 1 1 1 1 1 1

这就是标准的ASCII码
全称:美国标准信息交换码

那么,一个最基本的存储单元是8位,多出来的最高位如何处理?

在最开始的处理方案中,最高位一律补0

如下

1 0 0 0 0 0 12 ^ 6 + 1 = 65
1 1 1 1 1 1 12 ^ 7 - 1 =127(128个字符)
扩展ASCII 码2 ^ 8 - 1 =255(256个字符)

国标码

国标码 GB2312=ASCII+常见汉字+符号;
国标码不一定是一个字节
编码长度   eg: log2(128)=7

数值型数据表示

—整型int

无符号整数

eg: 假设用2字节存储整数。

000000000 100110177
无符号整数各位均为数据位,按二进制存,可转换为十进制
十进制整数转换为二进制方法:除二取余倒排序
eg:77  
十进制整数转换为二进制
77 除以 2 , 商 38 余 1
38 除以 2 , 商 19 余 0
19 除以 2 , 商 9  余 1
9  除以 2 , 商 4  余 1
4  除以 2 , 商 2  余 0
2  除以 2 , 商 1  余 0
1  除以 2 ,[商 0] 余 1
得出二进制串 ( 1 0 0 1 1 0 1 )--77

有符号整数 + -

有符号整数最高位为符号位0/1,其余N-1位为数据位。
三种编码方案eg:原码、反码、补码
原码编码方案

2字节存储整数,最高位表示符号。
如果是正数最高位添0;如果是负数,最高位添1
两个字节最高位为符号位,其余15位表示数的数值。

+770 00000000 1001101
-771 00000000 1001101
反码编码方案
正整数反码与原码,补码保持一致
+770 00000000 1001101
负整数反码原码基础上符号位不变,其余变反
1 00000000 1001101原码 -77
1 111111111 0110010反码 -77
补码编码方案
正整数补码与原码,反码保持一致
+770 00000000 1001101
负整数补码反码基础上加1,(即:绝对值逐位变反末位加1)
1 00000000 1001101原码 -77
1 111111111 0110010反码 -77
1 111111111 0110011补码 -77

为什么要采用补码呢?

+0和-0的原码 反码 补码
+00 000 0000 0000 0000
-0 原码1 000 0000 0000 0000
-0 反码1 111 11111 1111 11111
-0 补码0 000 0000 0000 0000

(使用原码反码对于0会产生错乱->使用补码

为什么(内部存储)机器内对有符号整数实际采用补码表示
10表示法唯一。
2减运算可以化为加运算。

—实数float/double

IEEE754:
规定了单精度浮点数和双精度浮点数的两种实数的表示方法:
将真值转化为二进制数,并写成以2为基的科学计数法形式(+-1.M*2^e),之后分为符号位S、尾数M和指数e三部分存储。
符号位 0正 1负;尾数部分因小数点前均为1,故只存放小数点后的纯小数部分(隐含1);真值指数可正可负,为方便处理在原指数的基础上加上一正整数使其均非负(Excess码)。

-6.5D  ->   -110.1B   ->   -1.101B*2^+2
分类总位数符号位S指数E(阶码)尾数M
单精度32最高位次8位,真值指数e ∈[-126,127] ;阶码E=e+127∈[1,254]
双精度64最高位次11位,真值指数e ∈[-1022,1023] ;阶码E=e+1023 ∈[1,2046]
特殊情况+0.0S=0/1E全0M全0
特殊情况正无穷S=0/1E全1M全0
尾数M低端剩余部分各存储纯小数部分,隐含小数点前,这样能使精度更大,分别为:23+1/52+1

以下部分参考C语言中文网内容,如有侵权,望告知
💕💕
内容也欢迎指正的啦!!!

小数在被存储到内存前,首先转换为下面的形式:

 - >  1 . M × 2 ^ e

其中 M 为尾数,是二进制形式,且 1 ≤ M < 2;E 为指数,符号位S表示其正负。

举例:(32位float)对于 6.5,整数部分的二进制形式为:

6 = 1*4+1*2+0*1=110

小数部分的二进制形式为:

0.5 = 1×2^-1  = 1

将整数部分和小数部分合并在一起:

6.5 = 110.1

再将小数点向左移动2位:

110.1=1.101*2^+2

此时尾数为 101,指数为 2。

所有的小数被转换成指数形式后,尾数的整数部分都为1,
只把小数点后面的二进制放入内存中的尾数部分(23Bit)。
故对于 1.101,尾数部分是 101。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值