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

数据在内存中的存储

    • 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,一经查实,立即删除!

相关文章

QNX的nicinfo ifmcstat if_up和tcpdump

nicinfo 在QNX操作系统中&#xff0c;nicinfo是一个用于显示网络接口卡&#xff08;NIC&#xff09;信息的命令行工具。它可以提供有关系统中所有可用网络接口卡的详细信息&#xff0c;例如接口名称、MAC地址、IP地址、掩码、广播地址、传输单元大小等等。 通过nicinfo命令可…

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基础领航计划 系列(十六)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ…

Linux的sed命令

环境 Ubuntu 22.04 概述 sed 是“stream editor”的意思&#xff0c;用来处理文本&#xff0c;比如做文本查找、替换。 处理单行文本 用法1 语法&#xff1a; sed s/aaaa/bbbb/ aaaa &#xff1a;用正则表达式来匹配字符串&#xff0c;并用圆括号括起来需要获取的内容&a…

TCPDUMP抓包明确显示IP地址和端口号

经常使用tcpdump进行抓包的同学可以忽略了&#xff0c;这篇偏于使用扫盲&#xff1b;首先&#xff0c;tcpdump抓包目的IP显示为hostname&#xff0c;如果端口是知名端口&#xff0c;显示为协议名而不是端口号。这种默认其实略有问题的&#xff1a; 如果我们使用默认的hostname…

【蓝桥杯】马的遍历

马的遍历 题目描述 有一个 n m n \times m nm 的棋盘&#xff0c;在某个点 ( x , y ) (x, y) (x,y) 上有一个马&#xff0c;要求你计算出马到达棋盘上任意一个点最少要走几步。 输入格式 输入只有一行四个整数&#xff0c;分别为 n , m , x , y n, m, x, y n,m,x,y。 …

LeetCode算法练习top100:(6)图论

package top100.图论;import java.util.LinkedList; import java.util.Queue;public class TOP {//200. 岛屿数量//网格类问题的 DFS 遍历方法int[][] ways new int[][]{{-1, 0}, {1, 0}, {0, 1}, {0, -1}};public int numIslands(char[][] grid) {int m grid.length, n gri…

目标检测——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;通常结果都是说确实定位不到。 做自…

131.类型题-计算数学序列的和,请编写函数fun,其功能是S=……【满分解题代码+详细分析】(数学序列的和类型题-C/C++JavaPython实现)

文章目录 131.类型题-计算数学序列的和:计算并输出一.题目1.1 解题思路二.解题代码2.1 C/C++解题代码2.2 python解题代码2.3 Java解题代码三.解题代码仔细分析3.1 C/C++解题代码仔细分析3.2 Java解题代码仔细分析3.3 Python解题代码仔细分析四.本类型题解题诀窍五.寄语131.类型…

Spring Boot 之 ModelFactory

1.initModel 功能&#xff1a; public void initModel(NativeWebRequest request, ModelAndViewContainer container, HandlerMethod handlerMethod)throws Exception {Map<String, ?> sessionAttributes this.sessionAttributesHandler.retrieveAttributes(request);c…

Codeforces Round 910 (Div. 2)

Codeforces Round 910 (Div. 2) 文章目录 Codeforces Round 910 (Div. 2)ABCD A 模拟 #include <bits/stdc.h>using namespace std; const int N1e510; char s[N];void solve(){int n , k , cb 0 , ans 0;cin >> n >> k;for(int i 1 ; i < n ; i ){c…

简易电路特性测试仪

目录 摘 要... 3 第一章 绪论... 5 1.1 研究课题背景... 5 1.2 国内外发展概况... 7 1.3 课题研究的目的... 9 1.4 课题的研究内容及章节安排... 9 第二章 电路特性测试仪的设计方案... 10 2.1 系统总体设计思路... 10 2.2 电路特性测试仪总体设计方案…

HarmonyOS开发上手

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

【PyTorch】概述

文章目录 1. PyTorch是什么&#xff1f;2. PyTorch的特点3. PyTorch的架构 1. PyTorch是什么&#xff1f; PyTorch是一个深度学习框架&#xff0c;由Facebook于2016年开源发布。PyTorch是基于Torch框架的Python接口&#xff0c;旨在提供易用的强大工具来进行神经网络的构建和训…

python实现从远程服务器读取 JSON 文件、解析内容并将其存储到 MySQL 表中,然后删除已解析的文件

创建一个 Python 脚本&#xff0c;利用 Paramiko 库连接到远程服务器&#xff0c;读取 JSON 文件、解析内容并将其存储到 MySQL 表中&#xff0c;最后删除文件。 import paramiko import json import MySQLdb import os# SSH 连接参数 ssh_client paramiko.SSHClient() ssh_c…

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

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

做项目碰到的一些安卓与苹果的不兼容,做个记录

默认字体 // 苹果手机默认字体为 font-family:simsun; // 安卓和H5默认字体为 font-family: initial;屏幕截图(html-to-image) // 这里只做js部分(vue3使用)import * as htmlToImage from html-to-image;let imgcanvas ref() // 图片标签img的src指向const captureScreen ()…

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