「C语言进阶」数据内存的存储

简介: 🐰数据类型的介绍🐰类型的意义🐰数据类型的基本归类🌸整形家族:🌸浮点型家族:🌸构造类型:🐰整形在内存中的存储🐰大小端🐰关于有无符号字符类型和整形提升的经典题型

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

 

目录

🐰数据类型的介绍

🐰类型的意义

🐰数据类型的基本归类

🌸整形家族:

🌸浮点型家族:

🌸构造类型:

🐰整形在内存中的存储

🐰大小端

🐰关于有无符号字符类型和整形提升的经典题型


🐰数据类型的介绍

内置类型:

char        字符型        1字节

short       短整形        2字节

int            整形            4字节

long         长整形        8字节

long long更长整形     8字节

float         单精度浮点型        4字节

double     双精度浮点型        8字节

🐰类型的意义

1.使用这个类型开辟内存空间的大小

2.如何看待内存的视角

🐰数据类型的基本归类

🌸整形家族:

字符存储和表示的时候本质上使用的是ASCII值,ASCII值是整数,字符类型也归类到整形家族

char:

1.     unsigned char
2.     signed char

C语言并没有规定char就是 unsigned char,取决于编译器(一般char就是 unsigned char)

short:

1.     unsigned short [int](int可以省略)
2.     signed short [int](int可以省略)

int :

 

1.   unsigned int 
2.     signed int

long :

1.   unsigned long[int](int可以省略)
2.     signed long[int](int可以省略)

 

🌸浮点型家族:

float

double

以后会详细解读浮点型

🌸构造类型:

数组类型

int arr[10]的类型int [10],因此数组类型很多,又称自定义类型

结构体类型

struct 关键字

枚举类型

enum 关键字

联合类型

unio 关键字

指针类型

1. int* pi
2. char* pc
3. float* pf
4. void* pv

*空类型

void表示空类型,通常用于函数的返回类型、函数参数、指针类型

🐰整形在内存中的存储

一个变量的创建是需要开辟一段空间

原码,反码,补码

整数的二进制有三种表示形式:原码,反码,补码

三种表示形式都有符号位和数值位,符号位用0表示“正”,1表示“负”,而数值位正数的原、反、补都相同,

负数的原码,负数的反码就是在原码基础上符号位不变,数值位按位取反,负数反码+1就是补码

int a=20

00000000000000000000000000010100原码

00000000000000000000000000010100反码

00000000000000000000000000010100补码

int b=-20

10000000000000000000000000010100原码

111111111111111111111111111111111111101011反码

111111111111111111111111111111111111101100补码

注:对于整形来说:数据存放在内存中的其实是补码

int a=1;

补码:00000000000000000000000000000001

int b=-1;

原码:10000000000000000000000000000001

反码:1111111111111111111111111111111111111111110

补码:1111111111111111111111111111111111111111111

int c=a+b

c的补码: 1 00000000000000000000000000000000(这里是33位,但是只能存储32位,所以高位1,丢弃)

则c的补码:00000000000000000000000000000000

所以c的原码:00000000000000000000000000000000

🐰大小端

含义:

大端字节序:把一个数据的低字节的数据,存放在高地址处,把高字节的数据,存放在低地址

小端字节序:把一个数据的低字节的数据,存放在低地址处,把高字节的数据,存放在高地址

百度2015年工程师测试题

设计一个函数去判断大小端

1. #include<stdio.h>
2. int check_sys()
3. {
4.     int a=0x01223302;
5.     return *(char*)&a;
6. }
7. int main()
8. {
9.     if(check_sys()==2)
10.     {
11.         printf("小端\n");
12.     }
13.     else
14.     {
15.         printf("大端\n");
16.     }
17. }

🐰关于有无符号字符类型和整形提升的经典题型

1. int main()
2. {
3. char a=-1;
4. -1:原码:10000000000000000000000000000001
5.                  反码 :11111111111111111111111111111110
6.                  补码 :11111111111111111111111111111111
7.     a:发生截断
8.        补码:11111111
9. signed char b=-1;
10. unsigned char c=-1;  
11.        c:发生截断
12.        补码:11111111(这里的最高位不是符号位)
13. printf(“a=%d b=%d c=%d”,a,b,c);
14.     a:发生整形提升
15.        原来的补码:11111111
16.        现在的补码:11111111111111111111111111111111
17.        现在的反码:11111111111111111111111111111110
18.        现在的原码:10000000000000000000000000000001
19.     所以a的值为-1
20.     c:发生整形提升
21.        原来的补码:11111111
22.        现在的补码:00000000000000000000000011111111
23.        现在的原码:00000000000000000000000011111111
24.     所以c的值为255
25. 注意:这里的a与b是一样的,如果发生整形提升的时候,如果是有符号数,高位补符号位,如果是无符号数,高位补0(这都是针对补码)
26. }

AD7EAE66-D9EE-4CB3-9575-05562FDD9943.png标题

有符号char类型变量的取值范围:-128(补码10000000)~127

无符号char类型变量的取值范围:0~255

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸    



相关文章
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
34 3
|
4天前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
30 12
|
2天前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
25天前
|
C语言
【c语言】动态内存管理
本文介绍了C语言中的动态内存管理,包括其必要性及相关的四个函数:`malloc`、``calloc``、`realloc`和`free`。`malloc`用于申请内存,`calloc`申请并初始化内存,`realloc`调整内存大小,`free`释放内存。文章还列举了常见的动态内存管理错误,如空指针解引用、越界访问、错误释放等,并提供了示例代码帮助理解。
36 3
|
26天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
56 1
|
1月前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
1月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
1月前
|
存储 编译器
数据在内存中的存储
数据在内存中的存储
42 4
|
1月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
53 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
1月前
|
编译器 程序员 C语言
深入C语言:动态内存管理魔法
深入C语言:动态内存管理魔法