(一)、数据类型
(二)、整型数据储存规则
(三)、浮点型数据储存和取出规则
(一)、数据类型
(注:不同的类型在内存中申请不同大小内存来存放数据)
1.整型家族
<<1.>>
类型 大小(32位)【64位】
char(因为字符存储的实质是ASCLL码值,所以归结到整型家族中) 1 1
short 2 2
int 4 4
long 4 8 ( 单位:字节)
.....
<<2.>>有无符号
a,有符号 signed 最高位是符号位 0表示正数 1表示负数
b,无符号unsigned 最高位是0或者是1(即2的31次方)
c,除了char以外,int 同时表示signed int ,short....同理
d,对于char来讲比较复杂,在讲完整型存储规则之后附加例题讲解
2.浮点型家族
类型 大小(单位:字节)
float 4
double 8
(二)、整型储存规则
1.规则:整型数据以二进制的补码进行储存。
2.一个整数占4个字节也就是32个比特位,即是二进制的32位。
3.二进制有三种表现形式:原码 反码 补码
对于正整数来讲,原反补码保持一致
对于负整数来讲,换算规则是原码除了符号位以外的数据按位取反再加1得到补码(注:这个过程是互逆的,补码除了符号位以外的数据按位取反再加1得到原码)
例:
int a= -21
原码 10000000 00000000 00000000 00010101
反码 111111111 111111111 111111111 11101010
补码 111111111 111111111 111111111 11101011
十六进制 0x ff ff ff eb
(补充:此处十六进制换算法则:)
在vs2019内存调试中是以十六进制的形式显示出来,并且显示规则为小端。
4.作为补充内容:大端和小端。
大端:把一个数据的高位字节序放在低地址处,低字节序放在高地址处。
小端则和大端相反。
以上面-21为例:
补码 111111111 111111111 111111111 11101011
高字节序 低字节序
vs环境内存 左侧为低地址 右侧为高地址 存储规则为小端
(大端和小端与硬件有关,X86结构是小端储存的还有DSP、ARM:而KEIL和C51则是大端储存)
5.char类型(该部分例子为了更好理解数据的存储和取出,例子几乎没有实际应用价值)
在vs环境下char和signed char是一样的,但是在存储和取出使用时有以下注意事项:
<<1.>>以整形存储char类型时,要经过整型,截断再存储
<<2.>>在以整型方式取出使用时,要进行整型提升(在整型提升过程要注意类型,char类型则是最高位是什么就补什么,而unsigned char
则一律补0)
如图,最后一个的c和上面格格不入是因为在整型提升的过程中数据的运算规则出现不同。
对于c的解释如下(配合5.char类型下注意事项):
(从整型出发) -1的补码: 11111111 11111111 11111111 11111111
(截断:截低位,就是从后向前截) 1111 1111 (截断8比特位是因为char占一个字节大小)
(整型提升:因为c的类型是unsigned ,补充都为0) 0000 0000 0000 0000 0000 0000 1111 1111
最后打印为%d 打印整数,因为c是无符号视为正数,原码反码补码一致,打印数值根据其原码,最后的结果为255.
(三)、浮点型数据储存和取出规则
<<1.>>
1.浮点型数据的存储规则:存储其科学计数法的 S M E。
介绍S M f
以float=5.5f为例
十进制 5 . 5
二进制 1 0 1 . 1
2的1次方 2的0次方 2的-1次方 .....
科学计数法 (-1)^0*1.011*2^2
(-1)的S次方 * 1.011 * 2的E次方 (S表示正负,M为有效值(例子中的1.011),E表示向前挪动几位)
2.float类型
内存分布 (S为1比特位,E为8个比特位,M为23比特位)
S | E | E | E | E | E | E | E | E | M | M | M | . | . | . | . | . | . | . |
S为0或1;E为位数+127;M即省略个位1后的数从前向后存储即可无数记为0。
float=5.5的内存存储:
0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
对于double与float的不同是E为位数+1023和内存的大小不同
(S为1比特位,E为11个比特位,M为52比特位)
<<2.>>浮点型数据的取出规则
分三种情况
1.当E不全为0或不全为1时:
怎样存储则怎样取出,别忘记给有效值补充1
2.当E全为0时:
E指数的位数恒为1-127(或1023),有效值不可在补充1,表示很接近0的小数。
3.当E全为1时:
不用计算,视为正负无穷。(读者可以按照上面思路自己想一想,也可在讨论区讨论)
(四)、小结
本期的内容大致就是这些,读者有什么问题可以私信我或者在评论区提问,我会在看到后第一时间回复。
因为也是第一次写这些内容,有不对或者欠缺的地方请大家指正,讨论后会第一时间改正。
小编也是一个正在学习编程的菜鸟,写文章的目的就是能够和大家一起学习知识和巩固知识,如果大家觉着我的内容可以,请三连支持一波。
最后,如果您对我的内容有什么意见和建议,请私信我,我们一起讨论进步。非常感谢您的阅读和支持。