C语言——数据在内存中的存储

目录

数据类型

整形家族

浮点数家族

构造类型

指针类型

空类型

数据存储

原码反码补码

大小端存储

浮点型的存储


数据类型

整形家族

  • char (一个字节)                     又可分为unsigned char 和signed char
  • short (两个字节)                                  unsigned short 和signed short
  • int(四个字节)                                   unsigned int  和signed int 
  • long(八个字节)                                unsigned long 和signed long

 unsigned为无符号的,signed为有符号的。

字符型char在数据中存储的是ASCLL码值,又因为ASCLL码值为整形,所以char属于整形家族

浮点数家族

  • float (四个字节)
  • double(八个字节)

 浮点数在数据中的存储很特别,虽然float和int的大小一致,但其存取的方式不一样。

 

 

构造类型

构造类型是自定义的类型。

  • 数组类型                  (基本数据类型)  数组名  [元素个数]   int arr [10]
  • 结构体类型                                                                         struct
  • 枚举类型                                                                             enum
  • 联合类型                                                                             uniom

指针类型

  • int* p                    整形指针    访问权限:四个字节       加减1跳过四个字节
  • char* p                 整形指针    访问权限:一个字节       加减1跳过一个字节
  • float *p                 整形指针    访问权限:四个字节       加减1跳过四个字节
  • void* p                 无具体类型指针,可以将任意类型地址赋值给他

指针具体内容请访问:https://blog.csdn.net/Dreamswi/article/details/132077131?spm=1001.2014.3001.5502

 

空类型

void 为空类型,通常用于函数返回类型,函数参数,以及指针。

数据存储

原码反码补码

在内存中数据是以二进制存储的,并且存储的是补码

以10和-10为例(int a=10)

——10-10
原码0000000000000000000000000000101010000000000000000000000000001010
反码0000000000000000000000000000101011111111111111111111111111110101
补码0000000000000000000000000000101011111111111111111111111111110110

a为整形,大小为四个字节,有32个比特位可以用来存储,第32位表示正负,0为正,1为负。

正数的原码补码反码均相同。

而负数让原码反转(即0变成1,1变成0)得到反码,反码+1得到补码。想要拿到原码可以逆转这个过程,当然编译器是通过补码反转后+1得到原码。

大小端存储

大端存储:是指一个数据的低位字节序的内容放在高地址处高位字节序存的内容放在低地址处。

小端存储:是指一个数据的低位字节序内容存放在低地址处高位字节序的内容存放在高地址处。

 

 

浮点型的存储

S:确定正负号   E=浮点数的指数   M=有效数字
表达方式: (-1)^S * M * 2^E
 

  •  float:
  •  (S(1bit)  E(8bit)  M(23bit))共32bit
  •  
  •  十进制:0.5                    5.5
  •  二进制:0.1                    101.1
  •          1.0*2^-1               1.011*2^2
  •          S=0  M=1.0  E=-1       S=0  M=1.011  E=2
  •          S=0  M=0    E=-1+127   S=0  M=011    E=2+127

 

  •  double:
  •  (S(1bit)  E(11bit)  M(52bit))共64bit
  •  十进制:0.5                    5.5
  •  二进制:0.1                    101.1
  •          1.0*2^-1               1.011*2^2
  •          S=0  M=1.0  E=-1       S=0  M=1.011  E=2
  •          S=0  M=0    E=-1+1023   S=0  M=011    E=2+1023

注:因为空间有限,为了存储更大的数据,M一般会省略小数点前的1,取出时编译器会自动加上1

两种特殊情况:

 当E为全0时,E=1-127或者E=1-1023即为真实值。有效数字N不再加上第一位1。(这样做是表示正负0,以及接近0的小数)


 当E为全1时,如果有效数字M全为0,表示+-无穷大。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值