隐藏在背后的真相——数据存储的方式(上)

news2024/11/28 7:35:35

数据存储的方式

  • 1. 数据类型详细介绍
    • 1.1类型的基本归
  • 2. 整形在内存中的存储
    • 2.1原码,反码,补码
    • 2.2有符号(unsigned)和无符号(signed)
    • 2.3 例题
  • 3. 大小端字节序介绍及判断

所属专栏:C语言❤️
🚀 >博主首页:初阳785❤️
🚀 >代码托管:chuyang785❤️
🚀 >感谢大家的支持,您的点赞和关注是对我最大的支持!!!❤️
🚀 >博主也会更加的努力,创作出更优质的博文!!❤️
🚀 >关注我,关注我,关注我,重要的事情说三遍!!!!!!!!❤️

1. 数据类型详细介绍

前面我们已经学习了基本的内置类型:

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

注:C语言只规定了sizeof(long)>=sizeof(int),但是具体long取几个字节看编译器。

1.1类型的基本归

  1. 整形家族
1.char
 unsigned char
 signed char
2.short
 unsigned short [int]
 signed short [int]
3.int
 unsigned int
 signed int
4.long
 unsigned long [int]
 signed long [int]
5.long long
  unsigned long long  [int]
  signed long long [int]

注:这里把char类型的也归类到整形家族是因为,char存储的其实真正存储的是字符的ASCII码值,而ASCII码值也是整形,所以将char类型的数据也归类到整形家族里面去,还有char到底是signed char 还是unsigned char C语言没有明确规定。在vs里char表示signed char。

  1. 浮点家族
float
double

注:我们的浮点类型是没有有符号无符号这一说法的,无符号和有符号只针对于整形

  1. 构造类型
 数组类型	类型 [ ]
 结构体类型  struct
 枚举类型 	enum
 联合类型 	union
  1. 指针类型
int *pi;
char *pc;
float* pf;
void* pv;
  1. 空类型
void 表示空类型(无类型)
通常应用于函数的返回类型(void)、函数的参数、指针类型(void*)。

2. 整形在内存中的存储

我们之前学过了有了类型我们就可以创建变量,而创建变量是要在内存开辟空间的,而开辟空间的大小是取决于类型的。
那问题就来了,既然我们开辟空间的大小取决于类型,那么这些数据是怎么在内存中存储的呢?
我们知道int a=1;a在内存中占4个字节,那a的数据在这4个字节中是怎么存储的呢?难道就是单单的把1放进去?
于是这就涉及到了另一个知识点:原码,反码,补码。

2.1原码,反码,补码

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

  1. 而数值位正数的原、反、补码都相同
    比如上述的a
    在这里插入图片描述

  2. 负整数的三种表示方法各不相同。
    原码
    直接将数值按照正负数的形式翻译成二进制就可以得到原码。
    反码
    将原码的符号位不变,其他位依次按位取反就可以得到反码。
    补码
    反码+1就得到补码。
    比如int a=-1;
    在这里插入图片描述
    所以对于整形来说:数据存放内存中其实存放的是补码

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

我们看一下他们在内存中的存储:
在这里插入图片描述

  • 这我们分析以上述我们就可以清晰的看出数据在内存中是以补码的形式存储的。
    在这里插入图片描述
  • 但是这里我们发现我们内存中数据的存贮和我们实际写出来的数据顺序好像有点不一样。这是为什么呢?
    这就得归根到我们硬件,导致我们数据的存储方式有两种,大端和小端。

2.2有符号(unsigned)和无符号(signed)

  • 对于signed来讲:二进制的最高位是符号位。
    signed char a=1,他的二进制是 0000001,他的最高位是0,是一个符号位。

  • 对于unsigned:二进制的最高位不再是符号位,而是数值位。
    unsigned char a=1:他的二进制是 0000001,他的最高位是0不再是符号位了,他的所有数都是数值位。

  • 对于char类型的数据有8个bit位,这两种所能表达的数据范围是不同的
    signed char:
    在这里插入图片描述
    unsigned char:
    在这里插入图片描述

2.3 例题

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

我们分析一下char==signed char都是表示有符号,所以a,b的范围都是-128-127在范围内,所以a=b=-1。而我们c是无符号的
-1的二级制是:
在这里插入图片描述
所以最终答案:
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述
3. 例三:

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

在这里插入图片描述

这个和什么c=-128的结果是一样的,原因是截断后的表达式是一样的。

  1. 例四:
int main()
{
	unsigned int i;
	for(i = 9; i >= 0; i--)
	{
	    printf("%u\n",i);
	}
	retrun 0;
}

这里i是unsigned int也就是说当i–到-1的时候这个时候i的二进制位的补码是:11111111111111111111111111111111,到那时i又是个无符号的数所以这个为时候i就等于11111111111111111111111111111111==2^32,就这样会陷入死循环。

  1. 最后留了两个题目给小伙伴们,小伙伴们可以自己分析一下:
1.:
int main()
{
    char a[1000];
    int i;
    for(i=0; i<1000; i++)
   {
        a[i] = -1-i;
   }
    printf("%d",strlen(a));
    return 0;
}

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

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

  • 什么大端小端:
    大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
    小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
    在这里插入图片描述
    为什么又大端和小端呢:

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

那我们要怎么确定我们的是大端还是小端的存储方式呢?

  1. 我们可以通过上述的调试窗口中观察到我们数据的存储方式,通过上述图片可以发现博主的电脑是小端存储方式的。
  2. 我们可以通过特地的代码来确定我们的存储发方式。
    在这里插入图片描述
int main()
{
	int a = 0x00000001;
	if (*(char*)&a == 1)
		printf("小端\n");
	else if (*(char*)&a == 0)
		printf("大端\n");
	return 0;
}

通过&a拿到a的地址,我们知道a的类型是int4个字节,但是我们只需要拿到a的一个字节的数据,那怎么办?我们可以通过通过强制类型转换成char * 类型的,这样变成char*类型之后,我们解引用操作就可以访问到一个字节的空间了。

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

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

相关文章

学网络安全可以参考什么方向?该怎么学?

在这个圈子技术门类中&#xff0c;工作岗位主要有以下三个方向&#xff1a; 安全研发安全研究&#xff1a;二进制 方向安全研究&#xff1a;网络渗透方向 下面逐一说明一下。 安全研发 安全行业的研发岗主要有两种分类&#xff1a; 与安全业务关系不大的研发岗位与安全业务…

英文论文(sci)解读复现【NO.13】基于YOLOv5的自然场景下苹果叶片病害实时检测

此前出了目标检测算法改进专栏&#xff0c;但是对于应用于什么场景&#xff0c;需要什么改进方法对应与自己的应用场景有效果&#xff0c;并且多少改进点能发什么水平的文章&#xff0c;为解决大家的困惑&#xff0c;此系列文章旨在给大家解读发表高水平学术期刊中的 SCI论文&a…

python 真正的密码,字符串排序

代码&#xff1a; from typing import List def turePassword(wordList:List[str]) ->str:wordList list(set(wordList))#排序先字符串长度&#xff0c;其次字典序wordList.sort(keylambda x :(len(x),x))ans for i in range(len(wordList)-1,-1,-1):flag Truefor j in …

蓝奥声核心技术分享——无线同步群控技术

1.技术背景 无线同步群控技术指基于对目标场景状态变化的协同感知而获得触发响应并进行智能决策&#xff0c;属于蓝奥声核心技术--边缘协同感知(EICS&#xff09;技术的关键支撑性技术之一。该项技术涉及无线物联网边缘域网络的无线通信与智能控制技术领域&#xff0c;具体主要…

浅谈人工智能怎么提升工作效率

一、引言 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;逐渐成为各行各业提高工作效率的重要工具。本报告旨在通过分析人工智能在提高工作效率方面的作用&#xff0c;探讨其具体实现方法&#xff0c;并通过案例分析来深入了解其实际应用效果和优缺点&…

算法8.从暴力递归到动态规划1

算法|8.从暴力递归到动态规划1 目前感觉&#xff0c;背包问题和货币数组问题本质相同&#xff0c;货币的与dp相关的三种代码写完了&#xff0c;快复习不完了&#xff0c;背包暂时先不写了&#xff0c;回头再写&#xff0c;补充&#xff0c;再总结&#xff0c;结合那个C大神的文…

对KMP算法的一点碎碎念——上篇

对KMP算法的一点碎碎念——上篇 文章目录 对KMP算法的一点碎碎念——上篇1. KMP 算法 Next数组 求解问题1.1 前置知识-最长公共前后缀LCP1.1.1 前缀与后缀1.1.2 最长公共前后缀LCP 1.2 手算法求解 Next数组值(3种常见情况)1.2.1 情况1: next数组 正常存放匹配字符的长度情况1的…

前端面试-React专题

目录 一.React1. React 的主要特性是什么2.React 的核心思想是3. 什么是jsx4. render()函数5. 函数组件和类组件的区别6. HTML和React中事件处理的区别7. React 中的合成事件8. 虚拟Dom&#xff1f;为什么使用&#xff1f;如何实现&#xff1f;9. 在 constructor 中给 super 函…

Excel - 如何给单元格加上下拉框

当你使用下拉列表来限制人们在单元格中的输入时&#xff0c;数据输入会更快、更准确。当有人选择一个单元格时&#xff0c;下拉列表的向下箭头就会出现&#xff0c;可以点击它并进行选择。 创建一个下拉列表 / Create a drop-down list 你可以通过提供下拉列表使工作表更有效率…

基于微信小程序的教学质量评价系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

ubuntu下编译esp32 micropython固件编译(可自行增加模块)

目录 0. 前言1. 安装ESP-IDF2. 初始化Micropython仓库3. 选择ESP-IDF相应版本情况&#xff11;情况2 4. 开始编译5.烧录固件 0. 前言 为ESP32编译Micropython固件 操作系统&#xff1a;ubuntu22.04 1. 安装ESP-IDF 本节需要ESP-IDF环境&#xff0c;安装开发环境是必要的。 …

FPGA之手把手教你做多路信号发生器(STM32与FPGA数据互传控制波形生成)

文章目录 博主的念叨一、任务介绍1、本文目标2、设计思路3、设计注意事项 二、设计代码1.顶层文件代码2.波形生成模块3.ROM例化4.PLL例化5.引脚分配 总结 博主的念叨 博主建了一个技术资源分享的群&#xff0c;开源免费&#xff0c;欢迎进来唠嗑280730348 最近趁热打铁做了一…

pandas库的常用操作介绍

目录 1.1.Pandas概述2.Pandas索引结构3.groupby学习5.Pandas数值运算二元统计6.对象操作7.merge合并显示设置9.pivot操作10. 时间操作11.常用操作12.groupby操作13.字符串操作14.索引操作15.pandas绘图操作 1.1.Pandas概述 Python的pandas库是一个数据处理和数据分析库&#x…

javascript基础七:说说你对Javascript中作用域的理解?

一、作用域 作用域&#xff0c;即变量&#xff08;变量作用域又称上下文&#xff09;和函数生效&#xff08;能被访问&#xff09;的区域或集合 换句话说&#xff0c;作用域决定了代码区块中变量和其他资源的可见性 举个粟子 function myFunction(){let name小爱同学 } undef…

6.2:荷兰国旗问题

文章目录 实现key前面的数都小于等key&#xff0c;key后面的数都大于等于key1&#xff1a;前后指针法&#xff1a;2&#xff1a;挖坑法3&#xff1a;单指针法&#xff08;左神&#xff09; 辗转相除法求最大公约数 实现key前面的数都小于等key&#xff0c;key后面的数都大于等于…

【leetCode:剑指 Offer】20. 表示数值的字符串

1.题目描述 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。 数值&#xff08;按顺序&#xff09;可以分成以下几个部分&#xff1a; 若干空格 一个 小数 或者 整数 &#xff08;可选&#xff09;一个 e 或 E &#xff0c;后面跟着一个 …

深入篇【C++】类与对象:详解内部类+匿名对象+编译器对拷贝的优化

这里写目录标题 Ⅰ.内部类【特点】1.天生友元2.直接访问static成员3.访问限制符限制4.外部类的大小 Ⅱ.匿名对象【特点】1.一行生命域2.对象具有常性3.可强行续命 Ⅲ.拷贝对象时编译器的优化 Ⅰ.内部类 概念&#xff1a;一个类定义在另一个类内部&#xff0c;这个内部的类就叫做…

【Unity100个实用小技巧】如何修改UI上材质的Shader

☀️博客主页&#xff1a;CSDN博客主页&#x1f4a8;本文由 萌萌的小木屋 原创&#xff0c;首发于 CSDN&#x1f4a2;&#x1f525;学习专栏推荐&#xff1a;面试汇总❗️游戏框架专栏推荐&#xff1a;游戏实用框架专栏⛅️点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd;&#…

mysql基本操作1

库的基本操作 1.show variables like character_set_database 查看系统默认的字符集&#xff0c;若是指定数据库下使用该SQL&#xff0c;则查看的是该数据库对应的字符集。 2.show variables like collation_database 查看系统默认的字符集校验规则&#xff0c;指定数据库下使用…

Java 集合 - List 接口

文章目录 1.List 接口介绍2.List 接口常用 API3.ListIterator 迭代器4.ArrayList - 动态数组4.1 ArrayList 概述4.2 手撸动态数组 5.Vector - 动态数组6.LinkedList - 双向链表6.1 链表概述6.2 手撸双链表6.3 链表与动态数组的区别 7.Stack - 栈8.总结 1.List 接口介绍 在 Jav…