数据在内存中的存储(含面试题)

数据在内存中的存储

    • 1. 整数在内存中的存储
    • 2. 大小端字节序和字节序判断
      • 2.1 什么是大小端?
      • 2.2 为什么有大小端?
      • 2.3 练习
        • 2.3.1 练习1
        • 2.3.2 练习2
        • 2.3.3 练习3
          • 第一题
          • 第二题
        • 2.3.4 练习4
        • 2.3.5 练习5
          • 第一题
          • 第二题
        • 2.3.6 练习6

1. 整数在内存中的存储

在讲解操作符的时候,我们就讲过了下⾯的内容:有符号的整数的2进制表⽰⽅法有三种,即 原码、反码和补码三种表示方法均有符号位数值位两部分,符号位都是⽤0表⽰“正”,⽤1表⽰“负”,⽽数值位最⾼位的⼀位是被当做符号位,剩余的都是数值位。

正整数的原、反、补码都相同。
负整数的三种表示方法各不相同。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。

#include <stdio.h>
int main()
{int a = 20;//00000000000000000000000000010100 -- 源码//00000000000000000000000000010100 -- 反码//0000 0000 0000 0000 0000 0000 0001 0100 -- 补码// 0    0    0    0    0    0    1    4 -- 16进制表示//0x00 00 00 14int b = -10;//10000000000000000000000000001010 -- 源码//0x80 00 00 0a//11111111111111111111111111110101 -- 反码//0xff ff ff f5//11111111111111111111111111110110 -- 补码//0xff ff ff f6return 0;
}

在这里插入图片描述
在这里插入图片描述
所以,对于整形来说:数据存放内存中其实存放的是补码。

为什么呢?
在计算机系统中,数值⼀律⽤补码来表⽰和存储。
原因在于,使⽤补码,可以将符号位和数值域统⼀处理;
同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
这些内容在在以前的博客中详细讲过了,点击此处即可查看

2. 大小端字节序和字节序判断

当我们了解了整数在内存中存储后,我们调试看⼀个细节:

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

调试的时候,我们可以看到在a中的 0x11223344 这个数字是按照字节为单位,倒着存储的。这是为什么呢?
在这里插入图片描述

2.1 什么是大小端?

其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为⼤端字节序存储和⼩端字节序存储,下⾯是具体的概念:

大端(存储)模式:是指数据的低位字节内容保存在内存的⾼地址处,而数据的高位字节内容,保存在内存的低地址处。

小端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,保存在内存的高地址处。

上述概念需要记住,方便分辨大小端。

画图演示:
在这里插入图片描述

2.2 为什么有大小端?

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

这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着⼀个字节,⼀个字节为8bit 位,但是在C语⾔中除了8 bit 的char 之外,还有16 bit 的 short 型,32 bit 的 long 型(要看具体的编译器),另外,对于位数⼤于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于⼀个字节,那么必然存在着⼀个如何将多个字节安排的问题。因此就导致了⼤端存储模式和⼩端存储模式。

例如:⼀个 16bit short x ,在内存中的地址为 0x0010 x 的值为0x1122 ,那么 0x11 为⾼字节,0x22 为低字节。对于⼤端模式,就将 0x11 放在低地址中,即0x0010 中,0x22 放在⾼地址中,即 0x11 中。⼩端模式,刚好相反。我们常⽤的 X86 结构是⼩端模式,⽽ KEIL C51 则为⼤端模式。很多的ARM,DSP都为⼩端模式。有些ARM处理器还可以由硬件来选择是⼤端模式还是⼩端模式。

2.3 练习

2.3.1 练习1

请简述⼤端字节序和⼩端字节序的概念,设计⼀个⼩程序来判断当前机器的字节序。(10分)- 百度笔试题

#include <stdio.h>int check_sys()
{int a = 1;//1. 取出a的地址//2. 强制类型转换成char*后解引用,只取第一个字节的数据//3. 如果取出的是1,就是小端,取出的是0就是大端return *(char*)&a;
}int main()
{int a = 1;//0x00 00 00 01int ret = check_sys();if (ret == 1){printf("小端\n");}else{printf("小端\n");}return 0;
}

运行结果如图:
在这里插入图片描述

2.3.2 练习2
#include <stdio.h>
int main()
{char a = -1;//10000000000000000000000000000001//11111111111111111111111111111110//11111111111111111111111111111111//存储在a中要发生截断//11111111 - asigned char b = -1;//11111111 - bunsigned char c = -1;//11111111 - c//00000000000000000000000011111111printf("a=%d,b=%d,c=%d", a, b, c);//%d - 十进制的形式打印有符号的整数//这里会发生整形提升,无符号数整形提升直接补0//return 0;
}

运行结果如图:
在这里插入图片描述

2.3.3 练习3
第一题
#include <stdio.h>
int main()
{char a = -128;//10000000000000000000000010000000//11111111111111111111111101111111//11111111111111111111111110000000//10000000 - a//打印时发生整形提升,有符号数按符号位提升//11111111111111111111111110000000//signed char取值范围: -128~127//unsigned char取值范围: 0~255printf("%u\n", a);//%u 是以十进制的形式打印无符号的整数return 0;
}

打开计算器可以观察到:
在这里插入图片描述

运行结果如图:
在这里插入图片描述

第二题
#include <stdio.h>
int main()
{char a = 128;//00000000000000000000000010000000//10000000 - a//打印时发生整形提升,有符号数按符号位提升//11111111111111111111111110000000printf("%u\n", a);return 0;
}

这里可以观察到和上一题一样

运行结果如图:
在这里插入图片描述

2.3.4 练习4
#include <stdio.h>
int main()
{char a[1000];int i;for (i = 0; i < 1000; i++){a[i] = -1 - i;}//arr[i] --> char -128~127//-1 -2 -3 -4 ... -1000//-1 -2 -3 ... -128 127 126 125 ... 5 4 3 2 1 0 -1 ...//128 + 127 = 255printf("%d", strlen(a));return 0;
}

运行结果如图:
在这里插入图片描述

2.3.5 练习5
第一题
#include <stdio.h>
unsigned char i = 0;
//0~255
//当i等于255时
//00000000000000000000000011111111 - i(255)
//00000000000000000000000000000001 - 1
//00000000000000000000000100000000 - i + 1
//00000000 - i + 1 由于char只占8个比特位,所以发生截断
int main()
{//死循环打印"hello world"for (i = 0; i <= 255; i++){printf("hello world\n");}return 0;
}
第二题
#include <stdio.h>
#include <Windows.h>
int main()
{unsigned int i;//当i等于0时//00000000000000000000000000000000 - i(0)//10000000000000000000000000000001 - -1的原码//11111111111111111111111111111110 - -1的反码//11111111111111111111111111111111 - -1的补码//00000000000000000000000000000000 - i//11111111111111111111111111111111 - i - 1 for (i = 9; i >= 0; i--){//死循环打印printf("%u\n", i);Sleep(1000);}return 0;
}

运行结果如图:
在这里插入图片描述

打开计算器可以看到
在这里插入图片描述

2.3.6 练习6
#include <stdio.h>
int main()
{int a[4] = { 1, 2, 3, 4 };int* ptr1 = (int*)(&a + 1);int* ptr2 = (int*)((int)a + 1);printf("%x,%x", ptr1[-1], *ptr2);return 0;
}

运行结果如图:
在这里插入图片描述

画图分析:
在这里插入图片描述

由于,vs2022采用的是小段存储,所以,存放数据的时候低字节存放在地址处高字节存放在高地址处,故取出来时高位在右边低位在左边

通过监视也可以观察到
在这里插入图片描述

一个字节一个字节的显示情况如图
在这里插入图片描述

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

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

相关文章

android studio 打开flutter项目 出现 dart sdk is not configured

android studio 版本 flutter版本 解决方式 1 点击Open Dart setting 2 打勾Enable Dart support for the project 3 Dart SDK path 选择flutter/bin/cache/dart-sdk 4 打勾Enable Dart support for the following modules

Python标准库:math模块【侯小啾Python基础领航计划 系列(十六)】

Python标准库:math模块【侯小啾python基础领航计划 系列(十六)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

目标检测——R-CNN系列检测算法总结

R-CNN系列算法详细解读文章&#xff1a; R-CNN算法解读SPPNet算法解读Fast R-CNN算法解读Faster R-CNN算法解读Mask R-CNN算法解读 目录 1、概述1.1 获取目标候选框1.2 候选框提取特征1.3 候选框分类及边框回归 2、R-CNN系列算法概述2.1 R-CNN算法2.2 SPPNet算法2.3 Fast R-CN…

2024最新版软件测试八股文(文档)

前言 &#xff08;第一个就刷掉一大批人&#xff09; 有很多“会自动化”的同学来咨询技术问题&#xff0c;他总会问到我一些元素定位的问题。元素定位其实都不算自动化面试的问题。 一般我都会问&#xff1a;你是定位不到吗&#xff1f;通常结果都是说确实定位不到。 做自…

HarmonyOS开发上手

首先献出开发官网地址 &#xff08;https://developer.harmonyos.com/cn/develop/&#xff09; 本文内容 基础入门内容介绍安装DevEco StudioDevEco Studio常用功能介绍项目工程结构详解 1. 基础入门内容介绍 应用开发流程 在正式开始之前还需要了解一些有关的基础概念 方舟…

H5流媒体播放器EasyPlayer播放H.265新增倍速播放功能,具体如何实现?

目前我们TSINGSEE青犀视频所有的视频监控平台&#xff0c;集成的都是EasyPlayer.js版播放器&#xff0c;它属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;包括WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#x…

vivado分析-在 Versal 器件中执行 NoC 服务质量分析

AMD Vivado ™ 中的服务质量 (QoS) 用于将片上网络 (NoC) 编译器生成的当前 NoC 解决方案估算所得 QoS 与 AXI NoCIP 和 / 或 AXI4 ‑ Stream NoC IP 中指定的 QoS 要求进行对比。一旦 NoC 解决方案过时 &#xff0c; 就需要调用 NoC 编译器并生成新的 NoC 解决方案以…

论文投稿查询会议期刊及deadlines的网站

1. 这个是查近期CCF-ABC的ddl会议的网址 https://ccfddl.github.io/ https://ccfddl.top/ 2. 期刊选刊 https://ijournal.topeditsci.com/home https://journalsuggester.springer.com/ 3. IEEE出版物推荐 https://publication-recommender.ieee.org/home

Linux scatterlist 详解

源码基于&#xff1a;Linux 5.4 约定&#xff1a; 芯片架构&#xff1a;ARM64内存架构&#xff1a;UMACONFIG_ARM64_VA_BITS&#xff1a;39CONFIG_ARM64_PAGE_SHIFT&#xff1a;12CONFIG_PGTABLE_LEVELS &#xff1a;3 0. 前言 之前在《Linux DMA... 零拷贝》博文分享了DMA 技…

网络安全卫士:上海迅软DSE的员工上网管理策略大揭秘!

在日常办公中&#xff0c;企业员工可能会在互联网上有意或无意的将一些包含内部重要信息的内容发布出去&#xff0c;从而造成不必要的违规及泄密风险&#xff0c;因此对终端用户进行规范的上网行为管理&#xff0c;既能有效预防重要数据泄密&#xff0c;同时也能提高员工办公效…

连续性变量的组间差异分析

目录 正态分布 正态分布检测 1&#xff1a;图像法 2:计算法 Shapiro–Wilk W检验&#xff08;小样本推荐&#xff09; Lilliefors正态性检验 Anderson–Darling 或AD检验 DAgostino检验&#xff08;大样本推荐&#xff09; 独立样本t检验 1&#xff0c;方差齐性检验 …

JavaEE进阶学习:SpringBoot 的创建和使用

1.什么是Spring Boot Spring 的诞生是为了简化 Java 程序的开发的&#xff0c;而 Spring Boot 的诞生是为了简化 Spring 程序开发的。 Spring Boot 翻译一下就是 Spring 脚手架&#xff0c;它就是为了快速开发 Spring 框架而诞生的 2.Spring Boot 优点 起步依赖 (创建的时候…

如何用JS实现模糊查询功能

我是写的是JSON数据通过请求来获取&#xff0c;实现这个模糊查询功能我只用了indexOf返回数组下标这一种办法。方法不限&#xff0c;下面我只展示这一种方法喽&#xff01; indexOf是什么 indexOf是返回指定内容在原字符串中的位置&#xff0c;该方法是从数组的start处或数组的…

按升序输出各个字符串。

编写程序&#xff0c;设计并实现如下功能&#xff1a;从键盘输入多个字符串&#xff0c;按升序输出各个字符串。

从零开始搭建博客网站-----框架页

实现效果如下 发布的功能还没有实现&#xff0c;仅仅实现了简单的页面显示 关键代码如下 <template><div class"layout"><el-header class"header"><div class"logo">EasyBlog</div></el-header><el-c…

Python标准库:copy模块【侯小啾python基础领航计划 系列(十五)】

Python标准库:copy模块【侯小啾python基础领航计划 系列(十五)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

YOLOv8改进有效涨点 | 2023 | SPD-Conv空间深度转换卷积(高效空间编码技术)

一、本文介绍 本文给大家带来的改进内容是SPD-Conv&#xff08;空间深度转换卷积&#xff09;技术。SPD-Conv是一种创新的空间编码技术&#xff0c;它通过更有效地处理图像数据来改善深度学习模型的表现。SPD-Conv的基本概念&#xff1a;它是一种将图像空间信息转换为深度信息…

springboot的常用注解

声明解释这个对象&#xff08;类或者其他&#xff09;组件相关 名称作用Controller用于修饰MVC中controller层的组件SpringBoot中的组件扫描功能会识别到该注解&#xff0c;并为修饰的类实例化对象&#xff0c;通常与RequestMapping联用&#xff0c;当SpringMVC获取到请求时会…

国产API调试插件:Apipost-Helper

前言 Idea 是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它可以帮助开发人员更加高效地编写、调试和部署软件应用程序,Idea 还具有许多插件和扩展&#xff0c;可以根据开发人员的需要进行定制和扩展&#xff0c;从而提高开发效率,今天我们就来介绍一款…

笔记-模拟角频率和数字角频率的关系理解

先建议阅读前人此文&#xff08;点击这里&#xff09;&#xff0c;有助于理解。 模拟频率&#xff1a;f 模拟角频率&#xff1a;Ω 数字角频率&#xff1a;ω 其中&#xff1a;在模拟信号中Ω 2πf 正弦波表示&#xff1a;sin(2πft) sin(Ωt) 数字信号就是离散的&#xff…