数据的分类:
整形:char(字符型,因为字符在内存中存储的是其ASCLL码值ASCLL码值也为整形所以将其归为整形家族),short(短整型),int(整形),long(长整型),long long(更长的整形)
浮点型:float(单精度浮点型),double(双精度浮点型),long double(精度更准确的浮点型)
自定义类型:结构体,枚举类型,联合体类型
指针类型:各种类型的指针,包含上述的家族类型
整形的数据存储:
1.引入原码,反码,补码的概念和转换方式
一个整形有三种不同的二进制序列的表示形式即——原码,反码,补码
其中正数的原码,反码,补码三者相同,
所以原码,反码,补码的概念是只针对于负数产生的,且分开两部分,最高位为符号位(最高位为0则为正数,1则为负数),其余部分为数值位
原码:最根本直接的翻译二进制序列如:-2的原码为
10000000 00000000 00000000 00000010(32位机器上所示)
反码:将原码除去符号位不变,其余的全部取反如:-2的反码为
11111111 11111111 11111111 11111101(32位机器上所示)
补码:在反码的基础上加一 如:-2的补码为
11111111 11111111 11111111 11111110(32位机器上所示)(这是最终在内存中存储的整形数据)
内存中存补码原因:
1.补码可以将符号位与数值位直接一起进行运算,原码则不可以例如:
2的原码为:
00000000 00000000 00000000 00000010(32位机器上所示)
-2的原码为:
10000000 00000000 00000000 00000010(32位机器上所示)
其原码与原码相加并非得到的是0
则补码可以实现连带符号位一起进行计算
2.补码可以将加法和减法也统一进行计算:
因为CPU中只有加法器,所以用补码可以实现统一计算,且补码转化为原码的方式和原码转化为补码的方式相同(都为取反加一)
2.讲述大小端字节序的内容和判断
计算机是否是大端还是小端字节序是由CPU决定的
小端:二进制中低的二进制位数存放在低的地址处即为小端字节序排序法
大端:二进制中低的二进制位数存放在高的地址处即为大端字节序排序法
此为我计算机上的测试(用的vs2022)由此可见小的二进制数列位于低地址处(其右图展示的是以16进制展示的即 0a = 10)即为小端字节序排序法,大端与其相反。
判断是大端字节序还是小端字节序的方法:
3.了解signed和unsigned的区别
signed称为有符号数,而unsigned称为无符号数(即最高位符号位的变化)
int等大多类型默认为有符号数(char没有明确规定,看个人的编译器)
区别:例如:signed int a = -1;
其二进制序列为:
10000000 00000000 00000000 00001010其最终输出的结果为-1
而unsigned int a = -1
其二进制序列为:
10000000 00000000 00000000 00001010其最终输出的结果为4294967295(此为int的最大值)
就是因为其最高位符号位在无符号数的类型下,不再是符号位而是数值位所以无符号整形的值都>=0
浮点数的数据存储:
根据国际标准IEEE(电气和电子工程协会) 754即根据科学计数法所有的浮点数均可以写成:
V = (-1)^S * M * 2^E
其中V为浮点数,S取值为0/1用来控制符号位,M则为有效位数,E控制指数大小
以float为例:其有4个字节,32个bit位,如何分配请看下图
其最高位仍然为符号位
例:float a = 5.5
其转化为二进制为:101.1(没懂小数如何二进制的如下图)
将小数点后一位视作0.5往后0.5折半一次位权就多一位
(0.5,0.25,0.125如此加,凑你的原来的值如5.75就是101.11)
将其转化后的值101.1用规则好的公式转化一下即为:
101.1 = (-1)^ 0 * 1.011 * 2 ^ 2
V = (-1)^S * M * 2^E
此中的E不为全0或全1
其中S = 0,M = 1.011 ,E = 2(也要转化为二进制数来存储,存储时E为129)
这里的E要加上127来将其转化为无符号数(个人猜测因为两个符号位可能在底层逻辑上或者是某个方面比较难以实现或麻烦所以将其改为无符号数)即E的取值范围从-128~127改为0~255
其中的M存储时会自动先割弃最高位的1,因为数值位经过换算后的最高位一定是1,因为值肯定是大于0小于权重2的如十进制中的最高位肯定是1~9之间不会是0也不会是10,所以在二进制中只有1才可以是最高位,所以为了追求精度会舍去最高位1,在取出/输出时再将1加上
在内存中的存储为
0 10000010 01100000000000000000000(数值位多余的位置都补0)这就是浮点数5.5在内存中的存储方式
E为全0的时候
E为全零时就代表其原来的值为-127(因为E在存储时要+127转化为无符号数所以原来的值为-127)这时原来的值将为无限趋近于0的数字如V =(-1)^0 * 1.0......1 * 2 ^ (-127)
这时在存储的时候为了更加追求精度我们将输出时数值位1的值不在加上去而是以0.xxxxxx的形式输出,为了让其看起来更直观的趋近于0.
E为全1的时候
E为全一时就代表原值为128(因为8个bit位全1,代表的值是255(无符号位),此时原来的数值将无限接近于无穷大如V = (-1)^0 * 1.11...... * 2^128)
此时我们M有效位存储的23个bit位全部都为0用来表示这个数是一个无穷大的数
当机器为64位时如下图所示但原理都一样
如有错误,谢谢指出,感谢游览。