数据在内存中的存储1

简介: 数据在内存中的存储

引言

今天想给大家分享一下几个简单数据类型在内存中的存储方式以及规则,附有一些例题,都很有趣,那么咱们开始吧!

整数在内存中的存储

整数二进制有三种表示方式,分别是:原码,反码,补码

对于整型来说:计算机中存储的形式是补码

原码是十进制的直接二进制表示形式

就整型来说,还可分为有符号整型(+/-,0表示正数,1表示负数)和无符号整型,下面先来讨论有符号整型的转换。

  • 正数的原码,反码,和补码相同
  • 负数的反码是其符号位不变(第一个比特位),其他位按位取反(0变1,1变0)
  • 负数的补码是其反码加1

为了便于大家的理解这里举个例子:

(这里为了方便采用八个比特位模拟展示)

十进制整数    6

二进制原码:00000101

二进制反码:00000101

二进制补码:00000101

十进制整数   -6

二进制原码:10000101

二进制反码:11111010

二进制补码:11111011

为什么能用原码存储数据,还要引入反码和补码呢?

这是因为,再计算机数字计算的过程中,实现二进制减法的时候是一个相对加法复杂很多的过程。引入补码便可以通过简单的加法运算来实现有符号整数的加减法,而不再需要单独处理符号位了。这里有两点性质:补码加上其原码等于零,补码的补码等于其原码。

一些类型数据在内存中的存储

在刚刚讲解过整数的存储后,其他类型数据的存储也就好理解了。

  • char类型(8个比特位)可表示-128~127之间的整数(有符号),也可表示0~255之间的整数(无符号)
  • short(16个比特位)可表示-32768~32767之间的整数(有符号),也可表示0~65535之间的整数(无符号)
  • int(32个比特位)可表示-2147483648~2147483647之间的整数(有符号),也可表示0~4294967295之间的整数(无符号)
  • longlong(64个比特位)表示的范围更大,如果想了解详细范围可以了解#include头文件中存放的函数

了解了整数在内存中存储的形式,其实还有必要了解一下内存存储数据的不同字节顺序,这里分为大端序字节存储和小端序字节存储

大小端字节序存储及判断

大端字节序存储:高位字节存储在低地址

小端字节序存储:高位字节存储在高地址

我们可以先存储一个数据,来在编译器中观察一下其存储顺序

#include <stdio.h>
int main()
{
  int a = 0x11223344;
  return 0;
}

在初始化a过后,我们打开存储a的地址内存,可以发现,11 22 33 44似乎是从右向左存储的,这代表着11这样的高位字节存储在了高位地址,是典型的小端字节序存储。下图在再进行进一步解释,大小端序。

总的来说,大小端是存储数据的不同方式,它们之间也没有什么优劣之分,只要能达到存储和拿取数据的目的,哪一种方式都可以。

说了这么多,其实让我联想到了一个大厂的笔试题,考的是通过写一份代码,来判断运行机器是大端序还是小端序。 我把这道题的答案放到下面供大家来参考

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

这道题的原理其实很好理解

当为小端序时,指向的是0x01,表示的数字也就是1;当为大端序时 ,指向的是0x00,表示的数字是0。这样,就能很好的把大小端区分开了。

心---♥


数据在内存中的存储1https://developer.aliyun.com/article/1477743

相关文章
|
6天前
|
监控 算法 应用服务中间件
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
|
5天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
13 1
|
10天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
12天前
|
监控 Java easyexcel
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
38 1
|
14天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
15天前
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
27 2
|
19天前
|
存储 编译器
数据在内存中的存储
数据在内存中的存储
35 4
|
17天前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
36 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
4月前
|
存储 分布式计算 Hadoop
HadoopCPU、内存、存储限制
【7月更文挑战第13天】
268 14
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
298 0