C进阶:数据在内存中的存储(1)

news2025/2/23 0:39:20

 

引入:

大家好,感谢大家最近的支持,今天也是开始了C进阶一系列的博文的创作,欢迎大佬们来指点,欢迎来一起沟通!!!

数据类型的介绍

我们都知道:C语言具有以下几种数据类型:

char         //字符数据类型(大小:1字节)
short        //短整型(大小:2字节)
int          //整型(大小:4字节)
long         //长整型(大小:4/8字节)
long long    //更长的整型(大小:8字节)
float        //单精度浮点数(大小:4字节)
double       //双精度浮点数(大小:8字节)

这里注意的是:sizeof(int) <= sizeof(long),在上述类型中,我们可以通过limits.h中的(MAX和MIN)获得类型的的最大值和最小值(eg.INT_MAX和INT_MIN能够获得int类型的最大值和最小值)。

类型的意义:1.使用这个类型开辟内存空间的大小(大小决定了使用范围)

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

类型的基本归类

整型家族

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]

        signed long long[int]

需要注意的是:在这里char类型也算是整型家族,因为字符存储的时候存储的是ASCII码值。

浮点数家族

float(小数点后六位)

double(小数点后15位)

long double(小数点后20位)

构造类型

数组类型(eg.int arr[10]的类型为int [10])

结构体类型 struct

枚举类型 enum

指针类型

int* pi

char* pc

float* pf

void* pv

空类型

void表示空类型(无类型)。

通常应用于函数的返回类型,函数的参数,指针类型。

整形在内存中的存储

众所周知,一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同类型决定的

那么数据在开辟空间中是怎么存储的呢?

我们来看看:比如,

int a = 20;//创建一个整型类型,叫a,这时a申请了四个字节的空间来存放数据
int b = -10;

让我们来看以下概念:

原码,反码,补码

计算机中的符号有三种表示方法,即原码,反码,补码。

三种表示方法均有符号位整数位两部分:符号位(即开头的首个数字)用0来表示正数,用1来表示负数,而数值位三种表示方法各不相同。

原码

直接将数据的二进制按照正负数的形式翻译成二进制即可.

反码

将原码的符号位不变,其他位依次按位取反即可(即1变0,0变1)

补码

将反码+1即可得到补码。

对于正数来说,原码,反码,补码都相同

而对于负数来说,需要用以上方式进行转换。

对于整型来说:数据存放内存中的其实是补码。

为什么呢?是用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器,因此计算机只能做加法运算(即用补码做加法)),你们可以试试看,用补码做加法时才能得到正确结果。

举个例子:

再让我们看一下在内存中的存储:

 

我们可以看到a和b补码在内存中分别存储的是补码,但我们发现这个数据居然是反的,这是为什么? 这就涉及到了大小端

 大小端介绍

大端小端的定义

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

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

让我们来举个小栗子:

为什么会存在大端小端模式

计算机系统中内存是以字节为单位进行编址的,每个地址单元都唯一的对应着一个字节(8bit)。这可以应对char类型数据的存储需求,因为char类型长度刚好是一字节,但有些类型是超过一个字节的。因此这里就存在着一个如何安排多个字节数据中各字节的存放顺序的问题。正是因为不同的安排顺序导致了大端存储模式和小端存储模式的存在。

如何测试当前机器是大端还是小端

我们都知道,存储方式无非就是大端和小端这两种。即:

正着存:大端存储方式;

倒着存:小端存储方式。

所以我么可以考虑一下用一个数字来测试当前机器的大小端(即用1)。

在x86环境中,1的二进制形式为00000000000000000000000000000001.

所以就无非以下两种情况:

signed和unsigned的区别

对于整型家族来说,有:有符号和无符号的区分。

unsigned char(无符号char)

signed char(有符号char)   (实际用的话编译器是哪个char不确定,vs上是signed char)

short = signed short

int = signed int

下面有个小栗子来大致区分一下unsigned和signed

signed char:01010111(其中第一个0是符号位,其余位为数值位)

unsigned char:01010111(所有位都是数值位)

再来看这两张图:

我们可以看出:(在0-255的范围内)signed char是一个这样的大致循环的形式,而unsigned char则是走了“直线”。 

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

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

相关文章

拼多多继续ALL IN

2023年注定是中国电商不平凡的一年。 随着网购用户数量见顶&#xff0c;经济形势进入新常态&#xff0c;电商平台已经来到了短兵相接的肉搏战阶段。 此刻的618大促&#xff0c;硝烟弥漫&#xff0c;刀光剑影&#xff0c;电商“决战”似乎是迫在眉睫。对各个平台来说&#xff0c…

SpringBoot:WebSocket实现消息撤回、图片撤回

下面只是讲述一下实现思路&#xff0c;代码基本没有哈&#xff01;有时间单独发表一篇关于websocket的相关操作的博客。 1. 消息撤回、图片撤回 个人觉得关于撤回&#xff0c;需要下述几个过程&#xff1a; 发送的消息的标签上可以定义一个属性&#xff0c;这个属性的值应该是…

18- 弹幕系统设计

1、弹幕系统设计 场景分析&#xff1a;客户端针对某一视频创建了弹幕&#xff0c;发送后端进行处理&#xff0c;后端需要对所有正在观看该视频的用户推送该弹幕。 1.1、实现方式 使用短连接进行通信或使用长连接进行通信。 1.1.1、短连接实现方案 所有观看视频的客户端不断…

单元测试尽量不要区分类与方法

单元测试尽量不要区分类与方法 单元测试是软件开发中非常重要的一环&#xff0c;其主要作用是在开发过程中对代码进行自动化测试与检验&#xff0c;从而保证代码质量&#xff0c;减少错误和缺陷的产生。然而&#xff0c;在实际的单元测试中&#xff0c;很多人会选择将测试分成类…

svg教程-初识svg

第一章 认识svg 简单来说&#xff1a; 位图&#xff1a;放大会失真图像边缘有锯齿&#xff1b;是由像素点组成&#xff1b;前端的 Canvas 就是位图效果。 矢量图&#xff1a;放大不会失真&#xff1b;使用 XML 描述图形。 我在 知乎 上找了一个图对说明一下。 左边是位图&…

chatgpt赋能python:用Python打造个人网站的SEO优化

用Python打造个人网站的SEO优化 简介 在互联网时代&#xff0c;拥有一个个人网站已经成为了一个时尚和必要的事情。网站不仅可以展示你的技能和个人风采&#xff0c;还可以提高你的知名度和影响力。但是&#xff0c;如何让人们发现你的网站&#xff0c;通过搜索引擎来访问你的…

从中序与后序遍历序列构造二叉树(java)

从中序与后序遍历序列构造二叉树 leetcode 106 题 从中序与后序遍历序列构造二叉树解题思路解题代码&#xff1a;二叉树专题 leetcode 106 题 从中序与后序遍历序列构造二叉树 leetcode 106:从中序与后序遍历序列构造二叉树 原题链接 题目描述&#xff1a; 给定两个整数数组 i…

342. 4的幂

342. 4的幂 原题链接&#xff1a;完成情况&#xff1a;解题思路&#xff1a;参考代码&#xff1a; 原题链接&#xff1a; 342. 4的幂 https://leetcode.cn/problems/power-of-four/ 完成情况&#xff1a; 解题思路&#xff1a; 跟之前的一个丑数一样&#xff0c;循环条件就…

使用VSCode SSH公网远程连接本地服务器开发 - cpolar内网穿透

文章目录 前言视频教程1、安装OpenSSH2、vscode配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网地址远程 转…

MySQL-事件详解

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️树高千尺&#xff0c;落叶归根人生不易&…

本地Linux服务器安装MongoDB数据库【公网远程数据库】

文章目录 &#x1f449;关于作者&#x1f449;前言&#x1f61c;1. 配置Mongodb源&#x1f61c;2. 安装MongoDB&#x1f61c;3. 局域网连接测试&#x1f61c;4. 安装cpolar内网穿透&#x1f61c;5. 配置公网访问地址&#x1f61c;6. 公网远程连接&#x1f61c;7. 固定连接公网地…

基于Kubernetes的实战案例分享

▲ 点击上方"DevOps和k8s全栈技术"关注公众号 本技术文档旨在分享一个基于Kubernetes&#xff08;简称K8s&#xff09;的实际应用案例。我们将介绍K8s集群的规模、部署架构&#xff0c;并详细说明该案例在生产环境中的实际应用。通过本文档&#xff0c;读者将能够了解…

elasticsearchelastic-head docker安装

Elasticsearch8.7.1 安装 拉取镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:8.7.1创建elastic 网络 docker network create elastic执行创建 docker run --name esA --net elastic -p 9200:9200 -e ES_JAVA_OPTS"-Xms1g -Xmx1g" -it dock…

【笔记】微机原理及接口技术1 -- 微机基础与8086

微机基础 微机组成 下图展示了微型计算机的硬件系统基本结构 中央处理器(CPU): 负责执行计算机程序指令,进行数据运算和逻辑运算。 主存: 用于 storing 程序和数据,包括只读存储器 ROM 和随机存储器 RAM。 输入设备: 外部数据输入的途径,如鼠标、键盘、扫描仪等。 输出设备…

Hudi Flink SQL代码示例及本地调试

前言 之前在Flink Hudi DataStream API代码示例中总结了Hudi Flink DataStream API的代码及本地调试&#xff0c;并且在文中提到其实大家用Table API更多一些&#xff0c;但是我感觉Table API调试源码可能会比较难一点&#xff0c;因为可能会涉及到SQL解析&#xff0c;不清楚T…

【单片机 TB作品】基于STM32F103C8T6单片机的甲醛监测与报警系统

文章目录 原理图ZE08-CH2O甲醛传感器A9短信模块实物 原理图 ZE08-CH2O甲醛传感器 ZE08-CH2O是一种甲醛&#xff08;甲醛&#xff09;传感器&#xff0c;用于检测环境中的甲醛浓度。甲醛是一种有毒气体&#xff0c;广泛用于建筑材料、家具、地毯、化妆品和其他消费品的生产中。…

STM32单片机(三)第二节:GPIO输出练习(LED闪烁、LED流水灯、蜂鸣器)

❤️ 专栏简介&#xff1a;本专栏记录了从零学习单片机的过程&#xff0c;其中包括51单片机和STM32单片机两部分&#xff1b;建议先学习51单片机&#xff0c;其是STM32等高级单片机的基础&#xff1b;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 &#xff1a;适用于想要…

案例挑战——MVVM框架理解和实践

MVVM框架理解和实践 一、背景介绍二、 什么是MVVM架构&#xff1f;1.架构示意图2.MVVM概念总结3.实现VM的框架 三、通过案例来理解MVVM框架1.没有使用MVVM架构的程序2.使用了MVVM架构的程序3.对比 四、总结 一、背景介绍 最近正在做新版项目的MVVM架构的结合业务的具体落地&am…

报表控件FastReport使用指南——如何打开WebP格式的图片

FastReport 是功能齐全的报表控件&#xff0c;可以帮助开发者可以快速并高效地为.NET&#xff0c;VCL&#xff0c;COM&#xff0c;ActiveX应用程序添加报表支持&#xff0c;由于其独特的编程原则&#xff0c;现在已经成为了Delphi平台最优秀的报表控件&#xff0c;支持将编程开…

SWUST软件技术基础实验笔记

目录 前言 堆栈的操作 实验目的 实验要求 单链表操作 实验目的 实验要求 二叉树操作 实验目的 实验要求 查找与排序 实验目的 实验要求 查找算法 排序算法 实验总结 前言 软件技术基础实验分为四个部分&#xff0c;涵盖了堆栈的操作、单链表操作、二叉树操作以…