数据的存储

简介: 数据的存储

数据类型

char

short

int

long

long long

float

double


1.类型的基本介绍


类型的意义


1.所开辟的空间大小
2.如何看待内存空间的视角


1.1整型家族:


char (字符的本质是ASCII码值,是整型)
char不清楚是signed char 还是unsigned char
        unsigned char 
        signed char
short
       unsigned short
       signed short
int (默认为 signed)
   unsigned int 
   signed int
long
      unsigned long
      signed long


1.2浮点型家族:


float-单精度
double-双精度


1.3构造类型:


自定义类型-可以自己创建出新的类型


数组类型
结构体类型
枚举类型
联合类型


去掉名称剩余的就是新类型


int arr[10];        int[10];
char ch[10];        char[10];


1.4指针类型:


int*
char*
float*
void*


1.5空类型:


void表示空类型(无类型)
通常用于返回类型,函数的参数,指针类型。


2.整型在内存中的存储


数值有不同表示形式     10
//2进制                           0b1010
//8进制                           012
//16进制                         0xa
//十进制                         10


整数的2进制表示有三种表示形式


原码,反码,补码
1.正的整数,原码,反码,补码相同
2.负的整数,原码,反码,补码通过计算得到
原码:直接通过二进制形式写出二进制序列
反码:原码符号位不变,其余位按位取反
补码:反码+1

整数以补码形式在内存中保存 内存以十六进制展示

二进制与十六位进制转换->每四个二进制数转换成一个十六位进制数


#include<stdio.h>
int main()
{
  int a = -10;
  //1000 0000 0000 0000 0000 0000 0000 1010 -原码
  //0x8000000a
  //1111 1111 1111 1111 1111 1111 1111 0101 -反码
  //0xfffffff5
  //1111 1111 1111 1111 1111 1111 1111 0110 -补码
  //0xfffffff6
  int b = 10;
  //0000 0000 0000 0000 0000 0000 0000 1010 -原码=反码=补码
  //0x0000000a
  return 0;
}


b0e99d0b7c046be1917ec6e75862d095_ec759dacc0464e8b9103aa9e0e3aa71d.png

内存中存储的的确是补码,不过顺序有点有点问题

接下来介绍大小端进行解释


大小端存储


大端字节序存储:
数据中的低位存储在内存中的高地址,数据中的高位存储在内存中的低地址
小端字节序存储:
数据中的低位存储在内存中的低地址,数据中的高位存储在内存中的高地址

dda795f5c76ded9e1f03bbcd753ca7c6_1e658e3ab02e4506b6faae7b4ef86ee9.png


写段代码,判断当前机器的存储类型


#include<stdio.h>
int Check()
{
  int a = 1;
  // 0x 00 00 00 01 小端存储
  // 0x 01 00 00 00 大端存储
  char* p = (char*)&a;//取出第一个字节进行判断
  if (*p == 1)
  return 1;
  else
  return 0;
}
int main()
{
  int ret = Check();
  if (ret == 1)
  {
  printf("小端");
  }
  else
  {
  printf("大端");
  }
  return 0;
}


signed char 与 unsigned char 取值范围

afbacba7581f1c9f1a6d0b6901927e82_73d382ed7247470c97ee7a0dff424548.png

3a716acbd0507098b03f14281e0176f4_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA4oCcQ3J1c2jigJ0=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center.jpg


#include<stdio.h>
int main()
{
  char a = -1;
  //10000000000000000000000000000001  原码
  //11111111111111111111111111111110  反码
  //11111111111111111111111111111111  补码
  //截断
  //在char中的存储      11111111
  // 整型提升  按符号位进行提升   1
  //11111111111111111111111111111111  补码  
  // 原码      10000000000000000000000000000001
  signed char b = -1;
  //10000000000000000000000000000001
  //11111111111111111111111111111110
  //11111111111111111111111111111111
  //截断
  //在char中的存储      11111111
  // 整型提升  按符号位进行提升   1
  //11111111111111111111111111111111   -1
  //原码       10000000000000000000000000000001
  unsigned char c = -1;
  //10000000000000000000000000000001
  //11111111111111111111111111111110
  //11111111111111111111111111111111
  //截断
  //在char中的存储      11111111
  // 整型提升  按符号位进行提升   0
  // 00000000000000000000000011111111    补码
  // 原码      00000000000000000000000011111111  
  printf("a=%d b=%d c=%d", a, b, c);
  return 0;
}

e6aa929fad058f93290b5cd6c3916dc1_4b2d847fae2d46e1a24c66ac6ae9bc2b.png


浮点型在内存中的存储


存储时


任意二进制浮点数都可以表示成以下形式
(-1)^ s * M * 2 ^ E
(-1)^s 表示符号位    s=0   为正数;s=1   为负数
M表示有效数字,大于等于1小于2
2^E表示指数位
eg: 十进制 5.0
二进制表示形式为  101.0 ->1.01* 2 ^2
在内存中的存储形式为 (-1)^0  * 1.01  *  2^2


对于32位的浮点数,最高的1位是符号位,之后是8位的指数位,剩下的23位为有效位。


特殊规定


M 计算机保存M是默认第一位总是1,因此可以舍去
读取时再加上
E计算机保存E时先加上一个中间值 127(32位浮点数)


取出时


1E不全为0或不全为1减去127即可
2.E全为0,M不再加上1,以此表示接近于0的数字
3.E全为1,接近于无穷大
eg:  5.5 的二进制位表示形式为
101.1
(-1)^0  *1.011 *2 ^2
S=0
M=1.011
E=2   2+127=129  ->  1000001
0  1000001  011000000000000000000000


实例


#include<stdio.h>
int main()
{
  int i = 9;
  //0 00000000  00000000000000000001001  补码
  float* p = (float*)&i;
  printf("i的值:%d\n",i);//9
  printf("*p的值:%f\n", *p);// 0.000000
  // (-1)^0 *0.0000000000000000001001*2^-126
  *p = 9.0;
  //1001.0
  //1.001*2^3
  //(-1)^0*1.001*2^3    3+127=130 ->10000001
  //0 10000001 00100000000000000000000  
  printf("i的值:%d\n", i);
  printf("*p的值:%f\n", *p);
  return 0;
}

c243cd6a8cb7147c1a74874020cb306b_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA4oCcQ3J1c2jigJ0=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center.png


目录
相关文章
|
14天前
|
存储 编译器 C语言
数据的储存
数据的储存
26 0
|
6天前
|
存储
数据的存储
数据的存储
|
8月前
|
存储
【数据的存储】
【数据的存储】
49 0
|
8月前
|
存储 小程序 编译器
数据的存储(上)
数据的存储(上)
|
8月前
|
存储
数据的存储(下)
数据的存储(下)
|
10月前
|
存储 缓存 固态存储
一文看懂存储
一文看懂存储
206 1
|
10月前
|
存储 应用服务中间件 nginx
k8s--数据存储、EmptyDir存储
k8s--数据存储、EmptyDir存储
|
10月前
|
存储 监控 安全
使用阿里云存储
使用阿里云存储
77 1
|
11月前
|
存储 小程序 编译器
数据在内存中的存储形式
数据在内存中的存储形式
|
11月前
|
存储 SQL NoSQL
存储的未来
存储的未来
88 1