【C语言】数据存储(上)

简介: 【C语言】数据存储(上)

本章介绍:


  1. 数据类型详细介绍
  2. 整形在内存中的存储:原码、反码、补码
  3. 大小端字节序介绍及判断
  4. 浮点型在内存中的存储解析


1. 数据类型介绍



char        字符数据类型
short       短整型
int         整形
long        长整型
long long   更长的整形
float       单精度浮点数
double      双精度浮点数


类型的意义:


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

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


1.1 类型的基本归类


☀️整形家族:


  • 1: char:

unsigned char 无符号整型

signed char 有符号整形

char型用来储存字符,但是计算机用数字编码储存字符,如ASCII码值存储的是整数,所以字符和整形均可以表示char型。

❗️ C语言没有规定char类型本身是属于无符号还是有符号,这个是取决于编译器的

  • 2: short

unsigned short [int]
signed short [int]

  • 3: int

unsigned int

signed int

  • 4:long

unsigned long [int]

signed long [int]


☀️:浮点数家族:


float

double


☀️:构造类型:


数组类型

结构体类型 struct

枚举类型 enum

联合类型 union


☀️:指针类型:


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

void 表示空类型(无类型)

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


2. 整形在内存中的存储



我们之前讲过一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的


那接下来我们谈谈数据在所开辟内存中到底是如何存储的?


2.1 原码、反码、补码


☀️:计算机中的整数有三种->整数的二进制表示形式有3种: 原码、反码、补码 。整数在内存中存储的是: 补码(2进制)


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

正整数的原码、反码、补码是相同的

⭐️ 负整数的原码、反码、补码是要计算的


☀️:负整数的三种表示方法各不相同。


  • 原码

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

  • 反码

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

  • 补码

反码+1就得到补码。
⭐️对于整形来说:数据存放内存中其实存放的是补码。


举例:int a =-1 在内存中如何存储,

-1的二进制表示方法是 10000000 00000000 00000000 00000001 这是原码

原码 -> 10000000 00000000 00000000 00000001

反码 -> 111111111 111111111 111111111 111111110 (原码的符号位不变,其他位依次按位取反就可以得到反码)

补码 -> 111111111 111111111 111111111 111111111 (反码+1就得到补码)

-1在内存中存储的二进制补码就是111111111 111111111 111111111 111111111


🌟当然他们也是相辅相成的,既可以把原码转换成补码,也可以把补码转换成原码,那如何转换呢?

有两种方法:

1:补码-1 取反

2:取反 +1

b8452221c93147b1afcce7dc22c8370a.png


2.2 大小端


☀️ 大小端介绍::


我们看看在内存中的存储:

我们可以看到对于a存储的是补码。但是我们发现顺序有点不对劲。

这是又为什么?


d206e42d8d32437ab1c0ff131b5d00dc.png

⭐️其实这就是大小端午存储方式,他们的存储模式各不相同


  • 大端(存储)模式:

是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中;

  • 小端(存储)模式:

是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地 址中。


举例: int a = 0x11223344 图解

小端:数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地 址中


34c91740dcb748d9bac91eac19e6acf4.png


大端:数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中


c29e6de093904d7ca10525fccb216f4a.png

我们常用的 X86 结构是小端模式,而 KEIL C51 则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

⭐️:那如何判断当前机器是大端还是小端呢?


  • ☀️ 判断大小端::


#include<stdio.h>
int main()
{
  int a = 1;
  char* pa =(char*) & a;
  if (*pa == 0)
    printf("大端存储\n");
  else if(*pa ==1)
    printf("小端存储\n");
  return 0;
}


解析:


因为1的内存显示补码是 0x00 00 00 01

如果是小端存储会是 01 00 00 00

如果是大端存储会是 00 00 00 01

我们只需要用一个char*指针来访问第一个字节即可知道是否是 00还是01。


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 a = -1

signed char b= -1 的输出原理跟a一样

acde01b0e140438b914c9d052cfb09fb.png


⭐️ unsigned char c=-1;


67cb81145f424dff9ced5d701dbe3bd8.png

🌙->知识补充

有符号的负数如果发生整型提升高位补充符号位,即为1

有符号的正数如果发生整形提升高位补充符号位,即为0

unsigned无符号整形提升:高位补0即可


如对整型提升有不懂的可以看下此博客的 目录操作符->隐式类型转换


🌙 ->知识补充

有符号char的取值范围是 127 到 -128

unsigned 无符号char的取值范围是 0 到 255

以下图是char有符号类型的取值,存储的是补码

bbcb212f39c14bf7a685a0d9302da71d.png


  • 练习2 :下面代码输出什么❓


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


☀️ 解析:

34a02682052043a18c0e4070147577a5.png


  • 练习3 :下面代码输出什么❓


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


☀️ 解析:

c86d779d59454c04a9fd28aa7129ab4a.png


目录
相关文章
|
C语言
根本解决C程序 ignoring return value of ‘***’
去源码找到出问题的地方,处理一下返回值
493 0
|
9月前
|
监控 搜索推荐 API
淘宝店铺详情API接口的开发、应用与收益
淘宝开放平台提供了丰富的API接口,帮助开发者获取海量的商品和店铺数据。本文聚焦于淘宝店铺详情API接口的开发、应用及收益。首先,开发者需注册账号并创建应用以获取API密钥。接着,通过阅读接口文档,使用Python等语言编写代码调用API,处理返回的数据。该接口广泛应用于竞品分析、数据分析、价格监控、个性化推荐等领域,为开发者带来提高用户体验、降低运营成本、增加收入等多方面收益。同时,开发者需注意遵守法律法规、请求频率限制及数据安全等问题,确保合法合规地使用接口资源。
240 4
|
负载均衡 JavaScript 算法
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
273 1
|
数据可视化 定位技术 Python
数据可视化——绘制带有时间线的柱状图
数据可视化——绘制带有时间线的柱状图
|
10月前
|
JSON API 数据格式
淘系等商品评论Json数据格式参考,API接口测试
通过以上示例和说明,你可以了解淘系商品评论的JSON数据结构和如何使用相关API接口获取评论数据。在实际操作中,你需要参考具体的API接口文档和开放平台的相关说明进行配置和调用。
|
12月前
|
自然语言处理 索引
RAG入门:理解检索增强生成模型的基本原理
【10月更文挑战第21天】作为一名长期从事自然语言处理(NLP)研究的技术人员,我一直在关注各种新兴技术的发展趋势。其中,检索增强生成(Retrieval-Augmented Generation, RAG)模型引起了我的特别兴趣。RAG技术结合了检索系统和生成模型的优点,旨在解决传统生成模型在处理长文本理解和生成时所面临的挑战。本文将从个人的角度出发,介绍RAG的基本概念、工作原理及其相对于传统生成模型的优势,并探讨一些基本的实现方法。
649 1
|
12月前
|
编解码 前端开发 JavaScript
ThreeJs制作模型图片
这篇文章介绍了如何使用Three.js将一张图片转化为3D场景中的像素化模型,通过提取图片的像素颜色并将它们应用到3D立方体上,形成一种特殊的图像展示效果。
189 0
ThreeJs制作模型图片
|
JavaScript 前端开发
Vue学习之--------el与data的两种写法、MVVM模型、数据代理(2022/7/5)
这篇文章详细介绍了Vue中`el`和`data`的两种写法,解释了MVVM(Model-View-ViewModel)模型的基础知识,并探讨了数据代理的概念。文章通过代码实例和页面效果展示了这些概念的应用,还回顾了`Object.defineProperty`方法,并解释了Vue中如何实现数据代理。
Vue学习之--------el与data的两种写法、MVVM模型、数据代理(2022/7/5)
|
JavaScript Java 测试技术
基于微信小程序的网约巴士订票平台+springboot+vue.js附带文章和源代码设计说明文档ppt
基于微信小程序的网约巴士订票平台+springboot+vue.js附带文章和源代码设计说明文档ppt
216 1
|
存储 固态存储 安全
服务器硬件基础知识
服务器硬件基础知识
1042 1