# 深度剖析数据在内存中的存储

## 1. 数据类型介绍

1. char //字符数据类型
2. short //短整型
3. int //整形
4. long //长整型
5. long long //更长的整形
6. float //单精度浮点数
7. double //双精度浮点数
8. //C语言有没有字符串类型？

1. 使用这个类型开辟内存空间的大小（大小决定了使用范围）。

2. 如何看待内存空间的视角。

### 1.1 类型的基本归类

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. int a = 20;
2. int b = -10;

### 2.2 大小端介绍

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int check_sys()
{
int i = 1;
return (*(char*)&i);
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}

### 2.3 练习

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("a=%d,b=%d,c=%d", a, b, c);
return 0;
}

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
char a = -1;
//10000000000000000000000000000001
//11111111111111111111111111111110
//11111111111111111111111111111111
//11111111 - a
signed char b = -1;
//11111111 - b
unsigned char c = -1;
//11111111 - c
printf("a=%d,b=%d,c=%d", a, b, c);
//%d 是10进制的形式打印有符号的整数
//00000000000000000000000011111111
return 0;
}

1. #define _CRT_SECURE_NO_WARNINGS 1
2. #include<stdio.h>
3. int main()
4. {
5.  char a = -128;
6.  printf("%u\n", a);
7.  return 0;
8. }

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
char a = -128;
//10000000000000000000000010000000
//11111111111111111111111101111111
//11111111111111111111111110000000
//10000000 - a
//11111111111111111111111110000000
printf("%u\n", a);
//%u 是10进制的形式，打印无符号的整数
//%d 是10进制的形式，打印有符号的整数
return 0;
}

1. #include <stdio.h>
2. int main()
3. {
4. char a = 128;
5.   printf("%u\n",a);
6. return 0;
7. }

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
char a = 128;
//00000000000000000000000010000000
//10000000 -a
//11111111111111111111111110000000
printf("%u\n", a);
return 0;
}

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int i = -20;
//10000000000000000000000000010100
//11111111111111111111111111101011
//11111111111111111111111111101100
unsigned int j = 10;
//00000000000000000000000000001010 -原反补码相同
//11111111111111111111111111101100
//11111111111111111111111111110110 -相加 %d默认有符号，计算原码
//10000000000000000000000000001001
//10000000000000000000000000001010 -10
printf("%d\n", i + j);
return 0;
}

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
unsigned int i;
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);
}
return 0;
}

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
char a[1000];
int i;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d", strlen(a));
return 0;
}

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
unsigned char i = 0;
int main()
{
for (i = 0; i <= 255; i++)
{
printf("hello world\n");
}
return 0;
}

## 3. 浮点型在内存中的存储

3.14159

1E10

### 3.1 一个例子

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int n = 9;
float* pFloat = (float*)&n;
printf("n的值为：%d\n", n);
printf("*pFloat的值为：%f\n", *pFloat);
*pFloat = 9.0;
printf("num的值为：%d\n", n);
printf("*pFloat的值为：%f\n", *pFloat);
return 0;
}

n的值是没有争议的，第二个*pFloat也是没问题的，那为什么第一个*pFloat会是这个结果呢？以整形的形式存进去，以浮点型的形式拿出来答案会不一样吗？这说明整数的存储形式和浮点型不一样。所以我们以什么方式存进去就要方式取出来，这样才不会出错。

### 3.2 浮点数存储规则

num 和 *pFloat 在内存中明明是同一个数，为什么浮点数和整数的解读结果会差别这么大？

(-1)^S * M * 2^E

(-1)^S表示符号位，当S=0，V为正数；当S=1，V为负数。

M表示有效数字，大于等于1，小于2。

2^E表示指数位。

IEEE 754对有效数字M和指数E，还有一些特别规定。

IEEE 754规定，在计算机内部保存M时，默认这个数的第一位总是1，因此可以被舍去，只保存后面的

xxxxxx部分。比如保存1.01的时

10001001。

E不全为0或不全为1

0.5（1/2）的二进制形式为0.1，由于规定正数部分必须为1，即将小数点右移1位，则为

1.0*2^(-1)，其阶码为-1+127=126，表示为

01111110，而尾数1.0去掉整数部分为0，补齐0到23位00000000000000000000000，则其二进

E全为0

0的很小的数字。

0 01111110 00000000000000000000000

E全为1

9 -> 0000 0000 0000 0000 0000 0000 0000 1001

V=(-1)^0 × 0.00000000000000000001001×2^(-126)=1.001×2^(-146)

9.0 -> 1001.0 ->(-1)^01.0012^3 -> s=0, M=1.001,E=3+127=130

0 10000010 001 0000 0000 0000 0000 0000

|
5天前
|

C语言：数据在内存中的存储形式
C语言：数据在内存中的存储形式
50 0
|
1月前
|

C learning_11 （数组和在内存存储的理解、数组越界、数组作为形参）
C learning_11 （数组和在内存存储的理解、数组越界、数组作为形参）
15 1
|
1月前
|

30 0
|
1月前
|

[C语言]数据在内存中的存储（浮点数篇）
[C语言]数据在内存中的存储（浮点数篇）
31 0
|
1月前
|

39 0
|
29天前
|
Linux

172 6
|
1月前
|

innodb_buffer_pool_instances 如何根据cpu和内存进行配置
innodb_buffer_pool_instances 是用于配置 InnoDB 缓冲池实例数的参数。每个实例都管理缓冲池的一部分，这有助于提高并发性能。通常，你可以根据系统的 CPU 和内存来调整这个参数，以获得更好的性能。 以下是一些建议和步骤，帮助你根据 CPU 和内存进行 innodb_buffer_pool_instances 的配置： 1. **了解系统资源：** 首先，了解系统的硬件资源，特别是内存和CPU。检查系统上可用的物理内存和 CPU 核心数量。 2. **考虑每个实例的大小：** 在配置 innodb_buffer_pool_instances 时，
25 0
|
1天前
|

11 1
|
2天前
|

2024阿里云幻兽帕鲁/Palworld服务器价格表(CPU/内存/带宽/磁盘收费标准)
2024年阿里云幻兽帕鲁专用服务器的价格根据不同的配置有所不同。 • 4核16G配置的价格为32元/月，如果选择购买3个月，则价格为96元。 • 8核32G配置的价格为90元/月，如果选择购买3个月，则价格为271元。 另外，还有配置为4核16G10M带宽的服务器，其价格为26元/月起。而8核32G10M带宽的价格也是90元/月。
14 1
|
3天前
|

2024阿里云服务器租用价格表(CPU/内存/带宽/磁盘收费标准)

286 0

• 云迁移中心

更多

更多