C语言学习分享(第八次)------数据的存储

news2024/10/7 12:17:03

💓博主CSDN主页:杭电码农-NEO💓

⏩专栏分类:C语言学习分享⏪

🚚代码仓库:NEO的学习日记🚚

🌹关注我🫵带你学习更多C语言知识
  🔝🔝


在这里插入图片描述


数据的存储

  • 1. 前言🚩
  • 2. 整型在内存中的存储🚩
    • 2.1 源码,反码,补码🏁
  • 3. 大端和小端🚩
    • 3.1 为什么有大端小端?🏁
    • 3.2 怎样判断大小端🏁
  • 4. 类型的范围🚩
    • 4.1 char 类型的范围🏁
  • 5. 练习🚩
    • 5.1 练习一🏁
    • 5.2 练习二🏁
    • 5.3 练习三🏁
    • 5.4 练习四🏁
    • 5.5 练习五🏁
  • 6. 总结🚩


1. 前言🚩

本篇文章带给大家的内容有,整型在内存中的存储,大端小端的介绍与判断,和一些练习.从这篇文章开始,我们将进入C语言进阶知识的部分.


2. 整型在内存中的存储🚩

比如我们定义两个整型变量:

int a = 20;
int b = -10;

我们知道整型在内存中占四个字节的空间,在这之前我们先了解下面的概念


2.1 源码,反码,补码🏁

计算机中的整数有三种2进制表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位正数的原、反、补码都相同。
负整数的三种表示方法各不相同。

  • 源码:直接将数值按照正负数的形式翻译成二进制就可以得到原码。
  • 反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
  • 补码:反码+1就得到补码。

我们说正整数的源码,反码,补码都相同.并且对于整形来说:数据存放内存中其实存放的是补码。

这是因为在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;
同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

	int main()
{
	int num  = 20;//创建一个整型变量,叫 num,这时num向内存申请4个字节来存放数据
	//4个字节-32比特位
	//00000000000000000000000000010100-原码
	//00000000000000000000000000010100-反码
	//00000000000000000000000000010100-补码
    //正整数源反补相同
	int num2 = -10;//
	//10000000000000000000000000001010 - 原码
	//11111111111111111111111111110101 - 反码
	//11111111111111111111111111110110 - 补码
	//
	return 0;
}

假设我们要将这两个数相加,我们试试用反码,和补码相加,哪个是正确的:

源码相加:

//0000000000000000000000010100  num
//1000000000000000000000001010  num2
//1000000000000000000000011110  30的源码

补码相加:

//000000000000000000000010100  num
//111111111111111111111110110  num2
//011111111111111111111110110  补码
//000000000000000000000001010  10的源码   

我们有看见用补码做加减法是刚好符合逻辑的.

我们再来看看 -10 在 vs2022 编译器上的内存存储:

在这里插入图片描述

这里是倒着存放的数据,后面会讨论,现在我们暂且不看,但是我们能感受到实际上数据在内存中的存储是以补码的形式存储的


3. 大端和小端🚩

我们之前观察了补码在内存中的存储,我们发现有一点奇怪,为什么数据是倒着放的?这里我们用变量a来阐述这个问题

int a = 0x11223344;

我们说内存分为高地址和低地址,而数据又分高位和低位,比如说这里 11223344 的44 就是数据的低位,而 11 就是数据的高位,下面我给出大小端的定义:

  • 大端字节序(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中
  • 小端字节序(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中

字节序—就是以字节为单位,讨论存储顺序的.这里的 11 为一个字节, 22 为一个字节,整型共四个字节


在这里插入图片描述


3.1 为什么有大端小端?🏁

为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit。但是在C语言中除了8 bit的char之外,还有16 bit的short型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

例如:一个 16bit 的 short 型 x ,在内存中的地址为 0x0010 , x 的值为 0x1122 ,那么 0x11 为高字节, 0x22 为低字节。对于大端模式,就将 0x11 放在低地址中,即 0x0010 中, 0x22 放在高地址中,即 0x0011 中。小端模式,刚好相反。我们常用的 X86 结构是小端模式,而 KEIL C51 则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。


3.2 怎样判断大小端🏁

怎么写一个代码判断当前机器是大端还是小端? 这里我们定义一个整型变量a的值为1

它在大小端机器上应该是这样存储的:

在这里插入图片描述


我们想到,int类型的指针解引用可以访问四个字节的空间,而char类型的指针解引用可以访问一个字节的空间,我们定义一个char类型的指针指向变量a,如果对指针解引用的结果是1,那么当前机器就是小端,解引用后结果是0那么机器就是大端.

#include<stdio.h>
	int main()
{
		int a = 1;
		char* p = (char*)&a;//强制类型转换,否则会报警告
		if (*p == 1)
		{
			printf("当前机器为小端");
		}
		else
		{
			printf("当前机器为大端");
		}
	return 0;
}

4. 类型的范围🚩

我们把整型家族划分为:
在这里插入图片描述
下面我们主要来讨论 char 类型的范围,并做一些练习


4.1 char 类型的范围🏁

我们知道char类型在内存中占1个字节,也就是八个比特位(也可以说占八个二进制位),我们来讨论一下有符号char和无符号char的数据存储范围.

在这里插入图片描述
再来看看无符号位的存储:

在这里插入图片描述

  • 有符号位char的范围: -128~127
  • 无符号位char的范围: 0~255

并且我们可以发现一个规律,无符号char中,255+1,又跳到0去了,形成了一个循环,所以我们可以画这样一个圆形的循环图来理解:

在这里插入图片描述

在这里插入图片描述

我们可以看见,无符号位的char的127+1变成了128,而有符号位的char中的127+1变成了-128.并且无符号位中的255加1又回到了0,所以无符号char能存储的最大数就是255.超过255又会重新回到0.


5. 练习🚩

5.1 练习一🏁

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;
}

这里a和b很好判断,在vs编译器下,如果没有指定是否是有符号或者无符号,就默认为有符号形,然而c是无符号char类型的变量,它存储-1的补码在内存中,-1的补码是 11111111 然而无符号数的源反补码都相同,所以当-1被存储在无符号数中后,11111111八个1都不是符号位,值就为255了.


5.2 练习二🏁

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

首先这里会输出4294967168,为什么呢?首先a是有符号char类型的变量,存储-128的值,然而%u是打印无符号整数的意思,所以这里的char类型会发生整型提升,从一个字节提升至4个字节,又因为a是负数,它的的符号位为1,所以整型提升时前面全部都是补的1,所以我们就得到了一个数的补码,然而无符号数的源反补码都相同,所以我们就会得到一个特别大的数的源码.


5.3 练习三🏁

3.
unsigned int i;
for(i = 9; i >= 0; i--)
{
    printf("%u\n",i);
}

这里会死循环打印,我们来分析分析,这里的变量 i 是无符号整型,一个无符号数是肯定不会是负数的,当 i 等于0时再减去1,它会像我们刚刚讨论的无符号char类型一样变成无符号整型中的最大值,而不是-1,所以它会一直打印下去

这里给大家看一看现象:

死循环


5.4 练习四🏁

4.
int main()
{
    char a[1000];
    int i;
    for(i=0; i<1000; i++)
   {
        a[i] = -1-i;
   }
    printf("%d",strlen(a));
    return 0;
}

这里数组a的长度为255,我们来分析这一点.首先,数组a中存储的数据是有符号char类型的数据,数据范围是: -128 ~ 127之间.这里循环中 i 的范围是: -1 ~ -999 之间,数组中的内容会从-1开始一直往后存储,当i等于-128时,-1-128这时根据我们上面画的循环图,-1-128就等于127.下一步-1-129同理也就是等于126,然后125,124…这样存储下去,直到它变为0后又减一变成-1,以此循环往复直到装满1000个数为止.

当我们分析到这里还没有结束,我们知道这1000个元素其实就是 -128~127之间所有的数重复了几遍组成的,然而我们知道 strlen操作符的结束标志是遇见’\0’, 并且’\0’的ASCLL值是0,也就是说当strlen遇见0时,它就会终止,在外面数组中遇见的第一个0就会被系统当作数组的长度,根据外面刚才的分析,可以得出,第一个0出现时有128+127=255个元素已经在数组中,所以系统会认为数组的长度为255.也就是打印255.


5.5 练习五🏁

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

这个代码也会死循环打印hello world,这是因为当循环走到 i 等于255时, i 再加一其实不是256,因为无符号char类型能够存储的最大数就是255,根据外面刚刚画的循环图,255加一后就会重新走到0,以此一直循环下去.


6. 总结🚩

在数据的存储中,还有一个比较重要的点是浮点型在内存中的存储,这个部分放在下一章节讲解.

🔎 下期预告: C语言进阶 🔍
\

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/588833.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

现代化智慧档案室建设图文推介

1、防火。建立档案库房防火制度&#xff0c;档案库房附近严禁存放易燃、易爆物品&#xff0c;库房内严禁吸烟&#xff0c;并备有灭火器&#xff0c;经常进行检查更换。 主要设备为&#xff1a;烟雾探测器和感温探测器和七氟丙烷灭火系统。 2、防潮。库房内备有温湿度计&#x…

GB28181 对接海康平台,解决音视频卡顿问题

GB28181 对接海康平台,解决音视频卡顿问题 一、概述二、问题分析1、设备对比分析2、抓包对比分析3、验证分析结果三、总结四、讨论一、概述 设备使用GB28181协议对接海康平台时,发现音频和视频存在卡顿现象,不是一直卡顿,有时候卡有时候不卡,但是卡顿的时候音视频一起卡顿…

炫技操作--递归实现翻转链表(java)

递归实现链表的逆序 leetcode 206题。 翻转链表递归解法普通方式实现链表翻转链表专题 leetcode 206题。 翻转链表 leetcode链接用于测试 题目&#xff1a;描述 将一个链表翻转&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 递归解法 解题思路…

chatgpt赋能python:Python中删除的SEO

Python中删除的SEO Python是一个强大的编程语言&#xff0c;它广泛应用于各种领域&#xff0c;包括SEO。在SEO领域中&#xff0c;Python可以用来处理各种数据&#xff0c;包括删除不必要的数据。本文将介绍如何在Python中删除SEO数据。 什么是SEO数据&#xff1f; SEO是搜索…

代码创造的欢乐世界-通用人工智能让儿童熟练应用编程

想要复杂的参考这一篇&#xff0c;使用云平台即可完成&#xff1a; 美美的圣诞树画出来-CoCube- 把圣诞树换成六一儿童节主题的就可以啦。 这一篇是使用chatgpt类应用&#xff0c;给出关键提示词&#xff0c;代码自动生成哦。 神十六发射成功&#xff0c;科技工作者博士学位…

python接口自动化使用requests库发送http请求

目录 前言一、requests库二、HTTP 请求方法三、发送GET请求四、发送POST请求五、获取响应数据六、高级操作 6.1文件下载6.2文件上传6.3SSL证书验证6.4保持会话6.5requests封装总结 前言 今天笔者想和大家来聊聊python接口自动化如何使用requests库发送http请求&#xff0c;废…

【JavaSE】Java基础语法(三十七):Java 中的 String 类(源码级别)

文章目录 1. 构造方法1.1 String()1.2 String(String original)1.3 String(char[] chars)1.4 String(char数组,起始下标,长度)1.5 String(byte数组)1.6 String(byte数组,起始下标,长度)1.7 String(StringBuffer buffer)1.8 String(StringBuilder builder) 2. 普通方法2.1 char …

【Python教学】Python兼职有哪些?给你们分享一下最适合学生党/工作党的Python兼职攻略以及接私活经验

文章目录 前言一、做兼职的优势二、兼职种类三、基本技能要求四、平台和渠道五、案例分析六、做兼职注意事项总结 前言 Python是一种高级编程语言&#xff0c;它具有简单易学、代码可读性高、功能强大等特点&#xff0c;被广泛应用于数据分析、人工智能、Web开发等领域。Pytho…

修改mysql密码与mac中mysql的启动与终止

目录 修改mysql密码 1.进入你的mysql文件下的bin目录下&#xff1a; 2.修改mysql密码 mysql的启动与终止&#xff08;mac&#xff09; 修改mysql密码 1.进入你的mysql文件下的bin目录下&#xff1a; 如果不知道自己电脑上的mysql在哪里的话&#xff0c;输入&#xff1a; …

Redis7实战加面试题-高阶篇(布隆过滤器BloomFilter,缓存预热+缓存雪崩+缓存击穿+缓存穿透)

布隆过滤器BloomFilter 先看看大厂真实需求面试题反馈 1.现有50亿个电话号码&#xff0c;现有10万个电话号码&#xff0c;如何要快速准确的判断这些电话号码是否已经存在? 2.判断是否存在&#xff0c;布隆过滤器了解过吗? 3.安全连接网址&#xff0c;全球数10亿的网址判断 …

Java 多线程共享数据引发的问题

一、多线程并发情况下&#xff0c;线程不安全​​ 1、使用多线程实现银行取钱​​ package theads;/*** ClassName: TestBank* Description: TODO* Author: HLX* date: 2023/5/29 14:53* Version: V1.0*//*** 线程不安全&#xff1a; 取钱* <p>* 逻辑&#xff1a;* 连取…

更改测试用例执行顺序的几种自动化方法

前言 在自动化测试中&#xff0c;自动化测试用例设计原则就是执行过程时不能存在依赖顺序&#xff0c;那么如果测试用例需要按照指定顺序执行&#xff0c;这个时候应该怎么做呢&#xff1f;目前单元测试框架中unittest没有办法改变测试用例的执行顺序&#xff0c;但是另一个单…

一顿操作,我成为了年薪40W+的测试开发,人麻了...

前情提要 我的第一份工作就是拿的8000多&#xff0c;主要以功能测试为主。我用了大概6年的时间&#xff0c;成为了年薪40W的测试开发。回顾我从功能测试到测试开发的成长路径&#xff0c;基本上是伴随着“3次能力飞跃”实现的。 第一家入职的时候是一家小公司 刚开始入行的时…

发改委强化电力需求侧管理,缓解电力系统峰值压力

安科瑞 耿敏花 摘要&#xff1a;近年来全国用电负荷特别是居民用电负荷的快速增长&#xff0c;全国范围内夏季、冬季用电负荷“双峰”特征日益突出&#xff0c;恶劣气候现象多发增加了电力安全供应的压力。具有随机性、波动性、间歇性特征的可再生能源大规模接入电网对电力系统…

WebrtcNode publish 流程

WebrtcNode publish 流程 1. AmqpClient - RpcServer New message received AmqpClient - RpcServer New message received {method: publish,args: [67f9309ce6e645fc8a4bb9cac6406eb2,webrtc,{transportId: 67f9309ce6e645fc8a4bb9cac6406eb2,tracks: [Array],controller: …

Spring注解开发——bean的作用范围与生命周期管理

文章目录 1.bean管理1.1 bean作用范围Scope注解 1.2 bean生命周期PostConstructPreDestroy 2.小结 1.bean管理 1.1 bean作用范围 Scope注解 不写或者添加Scope(“singleton”)表示的是单例 如何配置多例&#xff1f; 在Scope(“prototype”)表示的是多例 1.2 bean生命周…

chatgpt赋能python:Python中的倒序函数

Python中的倒序函数 Python是一种现代编程语言&#xff0c;它在不断地扩展和更新&#xff0c;使得它在编程领域中变得越来越流行。Python的一个特点是&#xff0c;代码简洁而且易于理解。其中一个重要的特性是它的倒序函数。在本文中&#xff0c;我们将介绍Python中的倒序函数…

一位年薪40W的测试被开除,回怼的一番话,令人沉思

一位年薪40W测试工程师被开除回怼道&#xff1a;“反正我有技术&#xff0c;在哪不一样” 一技傍身&#xff0c;万事不愁&#xff0c;当我们掌握了一技之长后&#xff0c;在职场上说话就硬气了许多&#xff0c;不用担心被炒&#xff0c;反过来还可以炒了老板&#xff0c;这一点…

基于深度学习的人脸识别与人员信息管理软件【python源码+UI界面+功能源码详解】

人脸识别功能演示 摘要&#xff1a;人脸识别&#xff08;Face Recognition&#xff09;是基于人的脸部特征信息进行身份识别的一种生物识别技术&#xff0c;可以用来确认用户身份。本文详细介绍了人脸识别基本的实现原理&#xff0c;并且基于python与pyqt开发了人脸识别与信息管…