进阶C语言 第一章-------《数据类型》 (整形内存中的存储、浮点型在内存中的存储)知识点+基本练习题+深入细节+通俗易懂+完整思维导图+建议收藏(一)

简介: 进阶C语言 第一章-------《数据类型》 (整形内存中的存储、浮点型在内存中的存储)知识点+基本练习题+深入细节+通俗易懂+完整思维导图+建议收藏(一)

绪论

       书接上回,通过初阶知识的积累,相信你对编程有了很大的了解,但前方才是曙光,希望你可以继续和我一起对C语言的进阶知识进行探索学习,后面的难度会开始增加,也回略微有点绕,当相信只要你能认真的通过这篇文章的知识点和练习题就一定可以对数据类型有一个更加深入的了解。

image.png

所以安全带系好,发车啦(建议电脑观看)。


思维导图:

image.png

要XMind思维导图的话可以私信哈


目录


1.数据类型介绍

1.1整形家族

1.1.1整形家族

1.1.2为什么将char归为整形:

1.2浮点型家族

1.2.1浮点型家族:

1.3其他类型

1.3.1构造类型:

1.3.2指针类型:

1.3.3空类型:

2.整形的内存存储

2.1  整形的存储规则

2.2原、反、补码

2.2.1原、反、补的关系

2.2.2为什么要有原、反、补码

2.3大小端

2.3.1大端:

2.3.2小端:

2.3.3那为什么我们一定需要大小端存在呢?

3.浮点型的内存存储

3.1 浮点型的存储规则

3.1.1浮点型的存储规则

1.数据类型介绍

在前面我们已经将C语言中基本的内置类型学习了他们的

名称以及所占内存空间大小


内置类型:      

char                        //字符数据类型            1byte

short                      //短整型                       2byte

int                          //整形                           4    

long                       //长整型                        >=4

long long               //更长的整形                8

float                       //单精度浮点数            4

double                   //双精度浮点数            8

不同类型的意义:

内存中开辟的内存空间不同

看待内存空间的视角不同

1.1整形家族

知识点:

1.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]

long long

        unsigned long long [int]

       .....

附1:

为什么在short 、long后面加上[int]呢?因为short 你可以写成 short int / long int

附2:

unsigned 表示无符号的 、 反之signed 表示有符号的  ;所谓的有无符号就表示这个数的二进制的第一位算不算符号位。

如二进制-1:

他在内存中的存的是补码:

原码:10000000000000000000000000000001

反码:1111111111111111111111111111111111110

补码:1111111111111111111111111111111111111

当其 -1 前加上 unsigned 就代表其最前面的符号位不算也就将他在内存中的补码看成一个正数这个时候又因为,正数的原反补相同所以就会使-1成为一个在无符号整形中最大的一个数。

并且:在不同的编译器下char 不一定直接表示成 signed char(虽然常见的编译器如此),而int ,long ,short 就是完全等价于 signed int 、signed short、signed long

1.1.2为什么将char归为整形:

因为char在内存中以ASCII码值存储在内存中,而ASCII码值是以整形(‘a’ : 97,‘A’:65)的形式存储的所以将char类型归为整形(整形和字符的转化是:‘字符’ - ‘0’(48) = 对应的整形数字;整形+‘0’ =对应的字符数字)。

image.png

1.2浮点型家族

知识点:

1.2.1浮点型家族:

float

double

1.3其他类型

知识点:

1.3.1构造类型:

构造类型又称自定义类型有:

数组类型:被定义为构造类型的原因是其可以自定其自身的类型,如:int arr[10] :其类型就是int [10]  、同理你还可以将其改成int arr[20] : int [20]

即当数组的元素个数和元素类型发生变化时,这个数组也会跟着发生改变

而后面的三种情况就比数组类型要相对来说要好理解一点其为构造类型的原因也就是其可以自定义自己的类型(后面还会详细的讲到下面3种类型,早关注不迷路)

结构体类型 struc
枚举类型 enum
联合类型 union

1.3.2指针类型:

这在前面初阶指针已经讲过建议如果记不清了可以去康康

int *pi;

char *pc;

float* pf

void* pv;

1.3.3空类型:

void 表示空类型(无类型)

一般可以用到函数的返回类型、函数的形参。如:void test(void)此时test函数的返回类型是void也就表示不用返回、形参为void就表示其不需要传参进到test函数内。以及用到指针类型:void *处此时这个指针无指定的类型


在前面我们学习到了各种数据类型当他们创建后都会在内存中开辟一定的内存空间,而既然开辟了空间,那同时就需要知道其是怎么将这个数据放到这内存中的。

下面就将写到整形家族和浮点型家族在内存中的存储方式。

2.整形的内存存储

2.1  整形的存储规则

如:int a = 20; int b  = -10

内存情况:

image.png

附:创建的相邻变量在内存中相差2个地址(vs):其中变量b的在内存中所存为(f6 ff ff ff)以及a在内存中所存(14 00 00 00)

整形存储时他会在内存中的步骤

开辟内存空间

数据的存放与取出

开辟一个4byte大小的空间(而一个十六进制是4bit 两个 十六进制 就表示一个字节),所以一个整形会由8个十六进制组成 . (其本质应该为二进制但是二进制太长所以将其减化成十六进制展示)并且以补码的形式存进内存中)

并且他会大小端问题 将数据存进内存(如:我们可以看到到十六进制的a :0x 00 00 00 14  本应该为(0x 00 00 00 14)可实际上却以每个字节倒的存放了进内存(这就是大小端问题))

详细解释会在下面讲清:

2.2原、反、补码

知识点:

我们要知道整形在内存中是以补码的形式内存在的

我们应该了解原、反、补的转化规则

细节:

在计算机中整数有 三种 二进制的表示方法:那就是原、反、补

在这三种表示方法中

二进制的第一位 表示其 符号位(0为正 ,1为负)

其余位表示数值位

附:整数的原、反、补是相同的 所以原、反、补主要是运用到负数中

并且要记住,所有整形的计算都是通过补码进行的(以补码的形式加减乘除)

2.2.1原、反、补的关系

原码(我们看到的当printf打印出的二进制,即若要打印数字将会把内存中的补码转化成原码再进行得出数字打印)

直接将数字翻译成二进制就可以得到。

反码

将原码的符号位不变,其他位依次按位取反就可以得到了。

补码

反码+1就得到补码。

所以若我们要从补码到原码就可以倒回去:-1 、取反

然而,因为补码到原码还可以和原码到补码一样再一次:取反、+1

如:

-1 的原码:

1000 0000 00000000 00000000 00000001

反码(取反):

1111  1111  11111111   11111111   11111110

补码(+1):

1111 1111    11111111  111111111  11111111

反码进行和原码一样的方法:

取反:10000000000000000000000000000000

+1 :  10000000000000000000000000000001

2.2.2为什么要有原、反、补码

当我们有补码进行数值的运算时,我们就可以统一符号位和数值位直接进行计算

由1同时也就能退出可以让加法和减法统一处理( 1 - 1  =  1 + (-1)),cup中只有加法器

同时原码到补码和补码到原码可以通过相同的方法进行转化,这样就不需要额外的硬件电路

练习:

int a = 1;
int b = 1;
int c = a - b;

如上代码当我们要求c时:1-1   然而,因为cup中只有加法器, 所以就转化成 1 + (-1)

而负数的原反补并不相同所以还需要将-1的补码计算出来最后再与1相加

-1的补码:1111 1111 1111 1111 1111    1111  1111  1111

1的补码:  0000  0000 0000 0000 0000 0000 0000 0001

相加:     1 0000  0000 0000 0000 0000 0000 0000 0000 而因为超出了32位所以第33位就会截断最终变成:00000000 00000000 00000000 00000000  也就是0

这和我们所想的答案也一致


int a = 20; int b  = -10;

image.png

还是这个例子当我们&b 找到b的地址及他在内存中的存储后

应该如何将这个b存储在内存中:

首先我们写出他在的,int :4byte : 32bit:所以要写32位,同理char就是8位

原码:10000000000000000000000000001010

反码:111111111111111111111111111111110101

补码:111111111111111111111111111111110110

再将二进制的补码转化成十六进制:

补码:1111 1111 1111 1111 1111 1111 1111 1111 0110

          F       F     F        F     F      F      F      F      6

十六进制:0x FF FF FF F6

本应该为(0x FF FF FF F6)如此可是却以每个字节倒了过来(这就是因为大小端))

此时我相信你已经知道了什么是原、反、补了,那就让我们继续往下了解大小端,

相关文章
|
19天前
|
存储 程序员 编译器
C 语言中的数据类型转换:连接不同数据世界的桥梁
C语言中的数据类型转换是程序设计中不可或缺的一部分,它如同连接不同数据世界的桥梁,使得不同类型的变量之间能够互相传递和转换,确保了程序的灵活性与兼容性。通过强制类型转换或自动类型转换,C语言允许开发者在保证数据完整性的前提下,实现复杂的数据处理逻辑。
|
19天前
|
存储 编译器 程序员
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
在C语言中,内存布局是程序运行时非常重要的概念。内存布局直接影响程序的性能、稳定性和安全性。理解C程序的内存布局,有助于编写更高效和可靠的代码。本文将详细介绍C程序的内存布局,包括代码段、数据段、堆、栈等部分,并提供相关的示例和应用。
31 5
【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》
|
19天前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
40 8
|
22天前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
40 6
|
29天前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
101 13
|
23天前
|
存储 算法 程序员
C 语言指针详解 —— 内存操控的魔法棒
《C 语言指针详解》深入浅出地讲解了指针的概念、使用方法及其在内存操作中的重要作用,被誉为程序员手中的“内存操控魔法棒”。本书适合C语言初学者及希望深化理解指针机制的开发者阅读。
|
21天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
49 1
|
26天前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
存储 C语言
【C语言】四行代码说明浮点型在内存中的储存
【C语言】四行代码说明浮点型在内存中的储存
【C语言】四行代码说明浮点型在内存中的储存
|
19天前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
39 10
下一篇
DataWorks