首页 > 系统相关 >数据在内存中的存储

数据在内存中的存储

时间:2024-11-16 20:16:35浏览次数:3  
标签:11111111 存储 10000000 字节 00000000 char 内存 数据 原码

1. 整数在内存中的存储 : 整数的2进制表⽰⽅法有三种,即 原码、反码和补码 有符号的整数,三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表 ⽰“负”,最⾼位的⼀位是被当做符号位,剩余的都是数值位。 正整数的原、反、补码都相同。 负整数的三种表⽰⽅法各不相同。 原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。 反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。 补码:反码+1就得到补码。 为什么数据在内存中是以二进制补码形式存放的呢? 在计算机系统中,数值⼀律⽤补码来表⽰和存储。 原因在于,使⽤补码,可以将符号位和数值域统⼀处理; 同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是 相同的,不需要额外的硬件电路。 2.大小端字节序存储 ⼤端(存储)模式: 是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存在内存的低地址处。 ⼩端(存储)模式: 是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处 为什么会有⼤⼩端模式之分呢? 这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着⼀个字节,⼀个字节为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处理器还可以由硬件来选择是 ⼤端模式还是⼩端模式。 练习:写一个程序判断当前机器是大端字节序还是小端字节序 这里要把a的地址转化为char*类型,这样才能保证解引用操作时一次访问一个字节。

接下来通过几道经典题目加深对本节知识的理解:

题目一:

本题目主要考察指针加减整数的运算以及大小端字节序存储的相关知识。

解析:a是数组名,数组名表示数组首元素的 地址(两种情况例外:sizeof(数组名),&数组名)

&表示取出整个数组的地址(类型是int(*)【4】)加一跳过整个数组(指针类型决定了+-整数的步长)再将数组指针变量强制转化为int*型,-1(ptr[-1]等价于*(ptr-1))跳过4个字节(一个整型)解引用得到4。

a是数组名,数组名表示数组首元素的 地址,将a(地址)强转为int类型再加1,在换算成整型指针(地址)

+1跳过了一个字节,再进行解引用操作访问4个字节,具体如下图所示:

由于是小端字节序存储,所以解引用操作后在内存中存储的00 00 00 02会被还原读取出来

因此得到20 00 00 00(16进制表示形式)

题目二:下图程序的运行结果是?

本题目答案为死循环。

解析:char类型数据的存储范围是-128~127

00000000————0

00000001————1

00000010————2

………………

01111111————127

10000000————直接翻译成-128

10000001————  -127(转换为源码再算)

11111111————    -1

unsigned char类型的数据存储范围为0~255————11111111(2^8-1)

11111111在加一变为100000000,unsigned char类型只能保留8个bit位,首位的一会丢失,所以i达到255后在加一又会回到0,循环往复。

因此i<=255是恒成立的,程序会陷入死循环。

题目三:下图程序的运行结果是?

由上图不难看出,程序陷入了死循环。

解析:unsigned int类型的数据存储范围为0~2^32-1,当i减为0时在减一i就会变成2^32-1,循环往复。因此本题目i>=0是恒成立的,所以会陷入死循环。(0-1=-1,32位全一,全是数值位)

题目四:

解析:strlen的任务是找到字符数组中的\0,返回\0之前的元素个数。

char类型的数据存储范围为-128~127

所以数组a的内容如下:

-1-2-3……-128127……3210000

因此本题结果为128+127=255.

题目五:

解析:%u打印无符号整数,a是一个char型数据,128在内存中的存储形式为

00000000 00000000 00000000 10000000

char只保留一个字节  10000000

%u打印无符号整数,整形提升补符号位

11111111 11111111 11111111 10000000

由于%u打印无符号的整数,因此系统会认为上面的数字就是原码。转换成10进制就是4294967168

题目六:

本题目 -128

10000000 00000000 00000000 10000000————原码

11111111 11111111 11111111 01111111————反码

11111111 11111111 11111111 10000000————补码

char只保留一个字节  10000000

整型提升11111111 11111111 11111111 10000000

由于%u打印无符号的整数,因此系统会认为上面的数字就是原码。转换成10进制就是4294967168

题目七:

解析:

-1

10000000 00000000 00000000 00000001————原码

11111111 11111111 11111111 11111110————反码

11111111 11111111 11111111 11111111————补码

char只保留一个字节11111111

以%d形式打印,需要整形提升,补符号位

11111111 11111111 11111111 11111111

再翻译成原码,10000000 00000000 00000000 00000001,因此打印-1.

但由于c的类型是unsigned char,是无符号的,因此其在整形提升时补0

00000000 00000000 00000000 11111111

无符号整数的原反补相同,因此直接翻译255(2^8-1).

标签:11111111,存储,10000000,字节,00000000,char,内存,数据,原码
From: https://blog.csdn.net/2403_88695928/article/details/143770942

相关文章

  • 轻松理解操作系统 - 图文:Linux内核虚拟内存的基石是什么?
    第一大模块:一文串联文件系统模块上期文章中,我们了解了 Linux内存管理模块 的其中一大功能:内核虚拟内存管理。内核的虚拟内存是怎么管理的?内核虚拟内存的管理是用户程序创建进程和执行各种任务的基础。没有它,我们就无法正常使用系统。但,虚拟内存终究是要落到物理内存里面的......
  • 【数据运营】数据资产私域运营:探索并实现数据价值变现的新途径
             随着数字化浪潮的席卷,数据已成为现代企业的核心竞争力之一。然而,仅仅拥有数据并不足以在激烈的市场竞争中脱颖而出,关键在于如何有效地管理和运营这些数据资产,将其转化为实实在在的商业价值。本文将从数据资产私域运营的定义、价值、实施路径及实践案例等多个......
  • 智能体探秘数据宝库:数据库驱动的智能决策之旅
    一、数据利用数据仓库作为数据源:数据仓库是一个大型的、面向主题的、集成的、非易失的、反映历史变化的数据集合,用于支持管理决策。它存储了大量的结构化数据,这些数据是智能体进行学习和决策的重要基础。智能体可以通过访问数据仓库,获取所需的数据来训练模型、进行预测和决......
  • 穿越数据迷宫:C++哈希表的奇幻旅程
    文章目录前言......
  • GC优化:栈内存、span、NativeMemory、指针、池化内存 笔记
    stackalloc使用栈内存,减少GC压力varwordMatchCounts=stackallocfloat[wordCount];SpanSpan支持reinterpret_cast的理念,即可以将Span强制转换为SpanSpan支持reinterpret_cast的理念,即可以将Span强制转换为Span(其中,Span中的索引0映射到Span的前四个字节......
  • 数据库基础
    一、数据库概述1、数据处理的历史数据data:凡是能被计算机处理的东西,如字母、数字、汉字、声音、图片、动画等均认为是数据信息information:数据--->处理--->信息将数据处理为人们的决策有帮助作用的数据的集合就是信息2、数据处理有三个历史阶段人工管理阶段20世纪40......
  • 基于爬虫+数据可视化的服装数据分析系统设计和实现(源码+论文+部署)
    目录:目录:博主介绍: 完整视频演示:你应该选择我技术栈介绍:需求分析:系统各功能实现一览:1.注册2.登录部分代码参考: 项目功能分析: 项目论文:源码获取:博主介绍: ......
  • langchain_chatchat+ollama部署本地知识库,联网查询以及对数据库(Oracle)数据进行查询
    langchain_chatchat+ollama部署本地知识库,联网查询以及对数据库(Oracle)数据进行查询涉及的内容其实挺多的,所以尽量减少篇幅目录langchain_chatchat+ollama部署本地知识库,联网查询以及对数据库(Oracle)数据进行查询准备工作:部署ollama以及拉取模型部署langchain_chatchat部署ora......
  • 数据库基础(13) . MySQL视图
    1.介绍1.1.什么是视图MySQL中的视图是一种虚拟表,它并不存储实际的数据,而是存储了一条SELECT查询语句的结果集。视图可以简化复杂的查询操作,保护数据,并且可以使数据库结构更加清晰易懂。1.2.视图的作用简化查询:视图可以将复杂的查询包装起来,使得最终用户只需要执行简单......
  • MySQL数据库1——数据库概论
    一.数据库概论1.数据库数据库(DataBase,DB):是长期存储在计算机内、有组织的、统一管理的相关数据的集合。简单来说,它就是一个存储各种数据的仓库,且存储过程不是随便而是有组织的。数据库管理系统(DBMS):位于用户与操作系统制键的一层数据管理软件,为用户提供访问DB的方法。我......