目录
 
1. 数据类型详细介绍
 
2. 整形在内存中的存储:原码、反码、补码
 
3. 大小端字节序介绍及判断
 
4. 浮点型在内存中的存储解析
 
 
1.数据类型详细介绍
 
 char
 
short
 
int 
 
long
 
long long
 
float
 
double
 
布尔类型(C99引入)包含在<stdbool.h>头文件中
 
—Bool专门用于表示真假的变量
 
true - 1
 
false - 0
 
而C语言中0表示假,非0表示真,在C语言中,布尔类型没多少用处
 
- 	_Bool flag = false;//Bool false - 0 
 
打印结果是888
 
1.1归类
 
 
 整形家族:  
 
 
 char         
 // 
 字符数据类型  
 
 
 short       
 // 
 短整型  
 
 
 int         
 // 
 整形  
 
 
 long         
 // 
 长整型  
 
 
 long long   
 // 
 更长的整形  
 
 
 float       
 // 
 单精度浮点数  
 
 
 double       
 // 
 双精度浮点数  
 
 
 //C 
 语言有没有字符串类型?  
 
 
 char  
 
 
 unsigned char  
 
 
 signed char  
 
 
 short  
 
 
 unsigned short 
  [ 
 int 
 ]  
 
 
 signed short 
  [ 
 int 
 ]  
 
 
 int 
 
 
 unsigned int  
 
 
 signed int  
 
 
 long  
 
 
 unsigned long 
  [ 
 int 
 ]  
 
 
 signed long 
  [ 
 int 
 ] 
 
 
 浮点数家族: 
 
 
 
  
  float  
 
 
  
  double 
 
 
  
   
   构造类型:  
  
 
   
   
   >  
   数组类型  
  
 
   
   >  
   结构体类型  
   struct  
  
 
   
   >  
   枚举类型  
   enum  
  
 
   
   >  
   联合类型  
   union 
  
 
   
   指针类型 
  
 
   
   
  
 
 int * 
 pi 
 ;  
 
 
 char * 
 pc 
 ;  
 
 
 float*  
 pf 
 ;  
 
 
 void*  
 pv 
 ; 
 
 
  
  空类型:  
 
 
  
  
  void  
  表示空类型(无类型)  
 
 
  
  通常应用于函数的返回类型、函数的参数、指针类型 
 
 
  
 2.整形在内存中的储存:原码,反码,补码
 
 
   变量的创建在内存中是需要开辟空间的,那其是如何储存的? 
 
 
  
  变量在内存中的储存是以二进制补码的形式储存在内存中的 
 
 
  
  
  对于正整形 
 
 
  
  原码,反码,补码相同 
 
 
  
  对于负整形 
 
 
  
  原码 
 
 
  
  反码 = 原码符号位不变,其余位按位取反 
 
 
  
  补码 = 反码+1 
 
 
  
   
   为什么呢?  
  
 
   
   在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统  
  
 
   
   一处理;  
  
 
   
   同时,加法和减法也可以统一处理( 
   CPU 
   只有加法器 
   )此外,补码与原码相互转换,其运算过程  
  
 
   
   是相同的,不需要额外的硬件电路。 
  
 
   
  
  
 
 
 
 
 
 
  储存方式与我们思考的又有点差异
 
 这里引入大小端字节序的概念
 
 
 
  
 大小端字节序:
 
 1)大端字节序存储:当一个数据的低字节数据放在高地址处,高字节序放在了低地址处,这种称为大端字节序存储。
 
 2)小端字节序存储:当一个数据的低字节数据存放在低地址处,高字节序放在了高地址处,这种成为小端字节存储。
 
 典例:简述大小端概念并写程序判断
 
 简述略
 
 判断
 
 编译器:VS2019
 
 
 
  3.浮点数在内存中的储存
 
 
 
 运行结果:
 
 
 
 由此可见:浮点数在内存中储存与整形不一样
 
 浮点数在内存中的存储规则 
 
 (-1)^s *M*2^E
 
 (-1)^s 符号位  s=0为正  s=1为负
 
 M为有效数字  1<=M<=2
 
 2^E 表示数位
 
 对于十进制 5.5  --->转换为二进制为101.1
 
 内存中的表示为 :(-1)* 1.011 * 2^2
 
 对于float类型
 
 4个字节32个bit 
 
 
 
  对于double类型
 
 
 
  
 
  
  IEEE 754 
  对有效数字 
  M 
  和指数 
  E 
  ,还有一些特别规定。  
 
 
  
  前面说过,  
  1≤M<2  
  ,也就是说, 
  M 
  可以写成  
  1.xxxxxx  
  的形式,其中 
  xxxxxx 
  表示小数部分。  
 
 
  
  IEEE 754 
  规定,在计算机内部保存 
  M 
  时,默认这个数的第一位总是 
  1 
  ,因此可以被舍去,只保存后面的  
 
 
  
  xxxxxx 
  部分。比如保存 
  1.01 
  的时  
 
 
  
  候,只保存 
  01 
  ,等到读取的时候,再把第一位的 
  1 
  加上去。这样做的目的,是节省 
  1 
  位有效数字。以 
  32 
  位  
 
 
  
  浮点数为例,留给 
  M 
  只有 
  23 
  位,  
 
 
  
  将第一位的 
  1 
  舍去以后,等于可以保存 
  24 
  位有效数字。  
 
 
  
  至于指数 
  E 
  ,情况就比较复杂。  
 
 
  
   
   首先, 
   E 
   为一个无符号整数( 
   unsigned int 
   )  
  
 
   
   这意味着,如果 
   E 
   为 
   8 
   位,它的取值范围为 
   0~255 
   ;如果 
   E 
   为 
   11 
   位,它的取值范围为 
   0~2047 
   。但是,我们 知道,科学计数法中的E 
   是可以出 现负数的,所以IEEE 754 
   规定,存入内存时 
   E 
   的真实值必须再加上一个中间数,对于 
   8 
   位的 
   E 
   ,这个中间数 是127 
   ;对于 
   11 
   位的 
   E 
   ,这个中间 数是1023 
   。 
  
 
  
    例如:2^-1 E为-1 ,存入内存中时,若E为8位则修正为  -1 + 255 --->126; 
  
 
  
                                                              若E为11位则修正为 -1 + 1023 --->1022 
  
 
  
    再转化为二进制数。 
  
 
   
   
  
    从内存中取E时,分三种情况 
  
 
   
  
    1)非全0/1 
  
 
   
  
    E = E-127(或1023) 得到真实的E,有效数字 M = M+1; 
  
 
   
  
    2)全为0 
  
 
  
    E = E-127(或1023)得到真实的E, 有效数字M = M; 
  
 
  
    这是为了表示很小的趋近于0或为0的数字。 
  
 
   
  
    3)全为1 
  
 
  
    如果有效数字M为0,则表示无穷大或无穷小的数字,符号取决于S。 
  
 
   
  
    解释上述题目*pFloat 以十进制打印为0的情况。 
  
 
   
  
    先写出9的补码 
  
 
   
   根据浮点数规则划分为
 
   
   E全为0,则符合情况二
 
  E = E -127 = -127
 
  *pFloat = (-1)^0 * M * 2^ -126  lim --> 0
 
  故打印十进制整形结果为0。