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

news2024/11/8 18:38:52

📕博主介绍:目前大一正在学习c语言,数据结构,计算机网络。

c语言学习,是为了更好的学习其他的编程语言,C语言是母体语言,是人机交互接近底层的桥梁。

本章来学习数据的存储。

让我们开启c语言学习之旅吧!

目录

一.数据类型详细介绍

1.1 类型的基本归类 

二.整形在内存中的存储:原码.反码.补码

2.1原码,反码,补码

三.大小端字节序介绍及判断


一.数据类型详细介绍

其实我们在最开始学c语言的时候就已经开始学习数据类型了,只是了解不够深入,本章就是深入学习数据类型。

前面我们学过基本的内置类型,并且关注他们在内存中所占的大小比如说:

类型的意义:我们在一些场景下使用需要关注内存的范围,比如数字很大的时候用int类型就不能解决问题了。 

有一个头文件<limits.h>在这个头文件中能观察到数据类型在内存中的最大值和最小值

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]

     注:字符存储的时候,存储的是ASCLL码值,是整形

浮点数家族

float
double

构造类型:(就是自定义类型)

> 数组类型
> 结构体类型 struct
> 枚举类型 enum
> 联合类型 union

指针类型

int *pi;
char *pc;
float* pf;
void* pv;

空类型

void 表示空类型(无类型)
通常应用于函数的返回类型、函数的参数、指针类型。

二.整形在内存中的存储:原码.反码.补码

我们之前学过创建一个变量的时候要在内存里面开辟空间,而空间的大小又是根据不同的类型决定的。

那么数据在所开辟的内存中到底是怎么存储的呢?

比如:

int a=20;
int b=-10;

我们知道a分配四个字节的空间

那如何存储?

了解下面概念

2.1原码,反码,补码

整形数据的表示形式有三种,即原码,补码,反码。

三种表示方法均有符号位数值位两个部分,符号位都是‘0’表示“正”,用1表示“负”,而数值位

正数的原,反,补都相同。

负整数的三种表示方法各不相同

原码

直接将数值按照正负数的形式翻译成二进制就可以得到原码

反码

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

补码

反码+1就得到补码

举个小栗子感受一下吧!

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

为什么呢?

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

看看变量在内存中的存储

通过观察在内存中存的确实是补码,似乎顺序有点不太对劲,这是为什么呢?

不管怎么样我们已经知道整形数据在内存中存的是补码,而且是倒着存的。 

为什么呢?

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

三.大小端字节序介绍及判断

什么是大端小端:

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

如果想要把这个0X11 22 33 44数据存入内存中,你会发现会有很多种方法。

为了方便拿取只保留了两种

注:字节序  --  是以字节为单位,讨论存储顺序的

为什么会有大小端之分呢?

为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为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处理器还可以由硬件来选择是大端模式还是小端模式。

设计一个程序来测试一下当前机器是大端还是小端吧

分析

只需要判断第一个字节就行了

代码

//如果是大端返回0
//如果是小端返回1
int check_sys()//方案1
{
	int a = 1;
	char* p = (char*)&a;//int*
	if (*p == 1)
		return 1;//小端
	else
		return 0;//大端
}

int check_sys()//进一步优化
{
	int a = 1;
	if (*(char*)&a == 1)
		return 1;//小端
	else
		return 0;//大端
}

int check_sys()//还可以继续优化
{
	int a = 1;
	return *(char*)&a;
}

int main()
{
	if (check_sys() == 1)
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}

通过本章的学习相信大家对数据的存储有一个更深层次的了解,下一篇要利用本章的知识去做一些练习,记得一键三连哦。

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

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

相关文章

Linux命令(31)之watch

Linux命令之watch 1.watch介绍 linux命令watch是周期性的用来执行某命令&#xff0c;并把某命令执行结果输出到屏幕上。使用watch命令&#xff0c;可以周期性的监测并输出某命令的执行结果到屏幕上&#xff0c;省得手动一遍一遍运行某命令&#xff0c;提高工作效率。 2.watc…

PHP伪协议filter详解,php://filter协议过滤器

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」&#xff1a;对网络安全感兴趣的小伙伴可以关注专栏《网络安全入门到精通》 php://filter 一、访问数据流二、过滤数据流三、多…

[第一章 web入门]SQL注入-2

拿到题目后看提示&#xff0c;要自主访问两个页面 访问login.php后&#xff0c;是一个登录界面&#xff0c;直接测试注入类型 第一件事还是输入常用账户名admin&#xff0c;密码随便输入 回显账号或者密码错误 这种登录界面一般都是字符型注入&#xff0c;所以测试一下闭合符&a…

【力扣刷题 | 第七天】

前言&#xff1a; 今天我们将会进入栈与队列的刷题篇章&#xff0c;二者都是经典的数据结构&#xff0c;熟练的掌握栈与队列实现可以巧妙的解决有些问题。 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 请你仅使用两个栈实现先入先出队列。队列应当支持一般队…

野火Renesas R4M2 UDS诊断bootloader 升级MCU

基于can总线的UDS软件升级 最近学习UDS诊断协议&#xff08;ISO14229&#xff09;&#xff0c;是一项国际标准&#xff0c;为汽车电子系统中的诊断通信定义了统一的协议和服务。它规定了与诊断相关的服务需求&#xff0c;并没有设计通信机制。ISO14229仅对应用层和会话层做出了…

从零开始Vue项目中使用MapboxGL开发三维地图教程(一)MapboxGL介绍以及前期vue项目的搭建

MapboxGL介绍以及前期vue项目的搭建 1、Mapbox-gl简介2、搭建vue项目2.1、创建vue项目2.2、注册mapbox官网2.3、mapbox-gl入门案例 3、Mapbox-gl地图主要配置参数说明 1、Mapbox-gl简介 Mapbox-gl是一个开源、基于webgl技术的前端地图类库。 地图数据渲染和可视化这块我们经常用…

chatgpt赋能python:如何培训Python?-从入门到专业化

如何培训Python&#xff1f;- 从入门到专业化 Python是一种高级编程语言&#xff0c;已被广泛应用于各种领域以及各种应用程序的开发中。如果你也想成为一名Python开发人员&#xff0c;有以下几种培训方法帮助你一步步实现你的目标。 1.自学Python 学习Python的最简单方法是…

【前端 - CSS】第 13 课 - CSS 应用案例 - 体育新闻

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、示例代码 3、总结 1、缘起 最近学习完了 CSS 的 引入方式、选择器 和 字体修饰属性 的相关知识点&#xff0c;然后运…

redis(一),redis简介,Linux下安装及基本配置

一.redis简介&#xff1a; 1.什么是redis Redis 是完全开源的&#xff0c;遵守BSD协议&#xff0c;是一个高性能的 key-value 数据库。它属于NoSQL数据库。 2.NoSQL简介&#xff1a; NoSQL有两种说法&#xff0c;一般指的是非关系型数据库&#xff0c;另一种说法是说它是“…

xml parser - etree

import xml.etree.ElementTree as ET# https://docs.python.org/3/library/xml.etree.elementtree.html # https://zhuanlan.zhihu.com/p/502584681def main():tree ET.parse(./country_data.xml)# 获取根元素root tree.getroot()print("{} {}".format(type(root),…

chatgpt赋能python:Python3.7安装指南

Python 3.7 安装指南 Python是一种高级编程语言&#xff0c;被广泛应用于Web开发、数据科学、人工智能等领域。而最新版本的Python 3.7则提供了更加稳定、更加高效的开发环境。这篇文章将介绍如何在不同的操作系统中安装Python 3.7。 Windows系统安装 Python 3.7 在Windows系…

chatgpt赋能python:安装Platform模块——让Python更好用

安装Platform模块——让Python更好用 Python是一种跨平台的编程语言&#xff0c;可以在不同操作系统上使用。作为Python的一个标准模块&#xff0c;Platform模块可以帮助开发者轻松获取有关操作系统及其特征的信息。这篇文章将介绍如何安装Platform模块&#xff0c;并提供一些…

cxGrid自动保存当前单元格输入的数据

遇到的问题&#xff0c;利用cxGrid做数据录入界面&#xff0c;当用户在一个单元格中录入数据&#xff0c;没有回车&#xff0c;然后直接点工具条上的保存按钮&#xff0c;执行数据提交&#xff0c;结果当前输入的内容丢掉了&#xff0c;又回到输入前的值。 在群中求助&#xf…

axios实战进阶练习——基于 Vue3 + Node.js + ElementPlus 实现的联系人列表管理后台

文章目录 &#x1f4cb;前言&#x1f3af;demo 介绍&#x1f3af;后端与接口的调试&#x1f9e9;关于运行后端项目&#x1f9e9;关于接口的调试 &#x1f3af;功能分析&#x1f9e9;数据的展示与分页功能&#x1f9e9;添加功能&#x1f9e9;编辑功能&#x1f9e9;删除功能 &…

大话Stable-Diffusion-Webui-动手开发一个简单的stable-diffusion-webui(一)

文章目录 写在前面整体效果开发所需环境开发工具需要具备的知识Node安装更改npm包安装的目录设置npm镜像vscode安装创建vue项目代码编写项目先体验注意写在前面 stable-diffusion-webui(以下简称sd)项目通过FastAPI对外提供了一系列的api用于开发者二次开发或者集成到自己的…

真正理解微软Windows程序运行机制——窗口机制(第三部分)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天说说Windows程序的运行机制。经常被问到MFC到底是一个什么技术&#xff0c;为了解释这个我之前还写过帖子&#xff0c;但是很多人还是不理解。其实这没什么&#xff0c;我在学生时代也被这个问题困绕过。…

帆软报表二次开发 树组件节点上添加自己的按钮

我这里的需求是在树组件的子节点上加一个复制按钮。 先看效果 这是一颗多选树,用的是bi.tree_value_chooser_pane 这个组件,这个组件默认支持多选,它默认的效果为: 这个组件没有提供机制来自定义节点的渲染。 通过查找源码发现这个组件内部构建树是通过BI.$.fn.zTree来构…

C语言进阶---数据的存储

1、整形存储和大小端 本章重点&#xff1a; 1、数据类型详细介绍 2、整型在内存中的存储&#xff1a;原码、反码、补码 3、大小端字节序介绍及判断 4、浮点型在内存中的存储解析 1.1、数据类型介绍 char 1byte //字符数据类型 short 2byte //…

【MyBatis】3、一文介绍如何用 MyBatis 进行多表级联查询

目录 一、设置新插入记录的主键&#xff08;id&#xff09;到参数对象中二、PageHelper 分页插件三、多表关系四、一对一五、一对多六、多对多 一、设置新插入记录的主键&#xff08;id&#xff09;到参数对象中 <insert id"insert01" parameterType"Studen…

【二叉树---堆】

二叉树---堆 一、树的概念及结构1. 树的概念2.树的相关概念3.树的表示 二、二叉树1.二叉树的概念2.特殊的二叉树3.二叉树的性质 三、堆1.堆的概念及结构2.堆的实现&#xff08;1&#xff09;函数的声明&#xff08;2&#xff09;函数的实现&#xff08;3&#xff09;测试堆的基…