(C语言)整数在内存中的存储与大小端

1. 整数在内存中的存储

整数的2进制表示方法有三种 ,即 原码、反码和补码

有符号类型数据三种表示方法均有符号位和数值位两部分 ,符号位都是用0表示“正” ,用1表示“负” ,最高位的一位是被当做符号位 ,剩余的都是数值位。

无符号类型的数据没有符号位只能表示正数。

正整数的原、反、补码都相同。

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

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

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

补码:反码+1就得到补码。

对于整形来说:数据存放内存中其实存放的是补码

为什么呢?

在计算机系统中 ,数值一律用补码来表示和存储。原因在于 ,使用补码 ,可以将符号位和数值域统一处理;同时 ,加法和减法也可以统一处理(CPU只有加法器) 此外 ,补码与原码相互转换 ,其运算过程是相同的 ,不需要额外的硬件电路。

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

我们来看一下数据在在内存中具体是怎么存在的:

我们发现16进制的11223344在内存中是以字节为单位倒着存储的。为什么呢?

2.1 什么是大小端

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

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

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

2.2 为什么有大小端?

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

例如:一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节,对于大端模式,就将0x11放在低地址中,及0x0010中,0x22放在高地址中,及0x0011中;小端模式,和其相反,我们常用的x86结构是小端模式,而KETL C51则为大端模式,很多ARM,DSP都为小端模式,有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

2.2 设计程序验证大小端

我们来设计一个程序来看看我们的编译器是什么模式

#include <stdio.h>

int Check()
{
	int i = 1;
	char* p = &i;
	return *p;
	//大端模式下返回0
	//小端模式下返回1
}

int main()
{
	if (Check())
		printf("小端模式");
	else
		printf("大端模式");
	return 0;
}

我在vs2022下运行结果为:小端模式

练习题

我们再来看一道练习题

#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;

}

这道题的输出结果是什么,先想一想。

解析:先看ptr1,&a+1指针跳过整个数组,然后有强制类型转换为int*,ptr1[-1]等于*(ptr-1),ptr-1,指向数组中的4,然后解引用结果为4,

再看ptr2,a为数组的首元素地址,将其强制类型转换为int再+1,即为地址这个数字加了1,再强制类型转换换位int*及指针指向了数组元素1中的第二个字节,然后再解引用,向后访问四个字节,因为我的编译器是小端模式,1在内存中是0x01000000 .2在内存中是这样的0x04000000,ptr2解引用访问到元素1中的0x000000和元素2中的0x02即返回0x02000000,以16进制打印结果为2000000

故答案为 4,2000000

感谢观看,欢迎在评论区讨论。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智慧公厕建设的主要目标是什么?

随着城市化进程的不断推进&#xff0c;公共厕所作为城市基础设施的重要组成部分&#xff0c;也变得越来越重要。为了提升公共厕所的管理水平、提供更好的服务质量&#xff0c;智慧公厕应运而生。智慧公厕的建设旨在通过信息化手段实现公共厕所的全面感知监测&#xff0c;实现公…

VGG论文学习笔记

题目&#xff1a;VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION 论文下载地址&#xff1a;VGG论文 摘要 目的&#xff1a;研究深度对精度的影响 方法&#xff1a;使用3*3滤波器不断增加深度&#xff0c;16和19效果显著 成绩&#xff1a;在ImageNet 20…

C++ 智能指针的使用

智能指针类型 在C程序中&#xff0c;普通变量使用栈内存&#xff0c;为函数运行时专用&#xff0c;结束后会自动释放&#xff0c;无须考虑内存释放问题。 但堆内存是共用的&#xff0c;其使用是通过指针变量的new来分配&#xff0c;使用delete来释放&#xff0c;因指针使用方便…

AI预测-一文解析AI预测数据工程

AI预测相关目录 AI预测流程&#xff0c;包括ETL、算法策略、算法模型、模型评估、可视化等相关内容 最好有基础的python算法预测经验 EEMD策略及踩坑VMD-CNN-LSTM时序预测对双向LSTM等模型添加自注意力机制K折叠交叉验证optuna超参数优化框架多任务学习-模型融合策略Transform…

Flink程序员开发利器本地化WebUI生成

前言 在flink程序开发或者调试过程中&#xff0c;每次部署到集群上都需要不断打包部署&#xff0c;其实是比较麻烦的事情&#xff0c;其实flink一直就提供了一种比较好的方式使得开发同学不用部署就可以观察到flink执行情况。 上代码 第一步&#xff1a;开发之前需要引入在本…

中间件漏洞(redis)

目录 1.Redis服务器被挖矿案例 2.redis常见用途 3.redis环境配置 4.redis的持久化机制 5.redis动态修改配置 6.webshell提权案例 7.定时任务bash反弹连接提权案例 8.SSH Key提权案例 9.redis安全加固分析 1.Redis服务器被挖矿案例 我没有体验过&#xff0c;那就看看别…

Flutter:构建美观应用的跨平台方案

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

【Fitten Code】“吊打“Github Copilot的国内免费代码辅助插件

&#x1f33b;个人主页&#xff1a;相洋同学 &#x1f947;学习在于行动、总结和坚持&#xff0c;共勉&#xff01; 目录 1.Github Copilot 2.Fitten Code 2.1 对话体验&#xff1a; 2.2 代码补全体验&#xff1a; 2.3 Pycharm安装方法&#xff1a; 2.4 Vscode安装方法…

git基础命令(一)

目录 基础概念git statusgit addgit diffgit loggit commit文件可以处于以下三种状态之一远程存储库与本地存储库参考 用于知识记录。后续有新的的内容&#xff0c;例子&#xff0c;将持续更新本文档。 基础概念 工作树&#xff1a;git add 之前&#xff0c;变动内容的文件列表…

Linux课程_____用户的管理

一、规则 用户至少属于一个组,在创建时如果不指定组,将会创建同名的组 用户只能有一个基本组(主组),但可以隶属于多个附加组 如果一个组作为某用户的基本组,此组将不能被删除 UID: 用户标识 GID: 组的标识 root管理员的uid及gid 都为0 二、用户的配置文件 1./etc/passwd …

<c语言学习> 整数和浮点数的存储方式

1.整数 有符号整数 第一位为符号位 1代表负数 0代表正数 举例&#xff1a; signed char 8 ---------------------> 0000 1000 -8 ----------------------> 1111 1000 &#xff08;补码形式存储&#xff09; 补码存储&#xff08;计算&#xff09;的妙处&…

Discourse 分类图片

我们可以在 Discourse 上为分类添加图片。 进入分类编辑界面&#xff0c;然后选择 Image 标签。 在 Images 标签下&#xff0c;上传分类需要的图片。 图片大小 图片的大小是 Discourse 进行控制的&#xff0c;高度为 150 PX 像素。 如果上传的图片大于 150 px 的高度像素&…

【JavaSE】类与对象

前言 Java是一门纯面向对象的语言&#xff0c;在面向对象的世界里&#xff0c;一切都为对象。它是解决问题的一种思想&#xff0c;主要依靠对象之间的交互完成一件事情。类与对象是我们学习面向对象最基础的知识&#xff0c;是面向对象实现的基石&#xff0c;可见它是有多么重…

打破数据孤岛,TDengine 与 Tapdata 实现兼容性互认证

当前&#xff0c;传统行业正面临着数字化升级的紧迫需求&#xff0c;但海量时序数据的处理以及数据孤岛问题却日益突出。越来越多的传统企业选择引入时序数据库&#xff08;Time Series Database&#xff0c;TSDB&#xff09;升级数据架构&#xff0c;同时&#xff0c;为了克服…

cesium 动态立体墙效果

cesium 动态立体墙效果 以下为源码直接复制可用 实现效果 实现思路 通过修改“material”自定义材质实现动态效果 核心类(WallImageTrailMaterialProperty)自定义材质 class WallImageTrailMaterialProperty {constructor(options) {this

推荐一款好用的前端分页插件jqPaginator

jqPaginator 简洁、高度自定义的jQuery分页组件&#xff0c;适用于多种应用场景。 现在网上各种各样的分页组件很多&#xff0c;但是很难找到十分“称心如意”的&#xff0c;于是jqPaginator诞生了。 我心中理想的分页组件&#xff0c;要不受CSS框架限制&#xff0c;可以使用…

汽车电子零部件(6):DMS/OMS、CMS

前言: 有一个部件过去不曾有,而如今有可能要标准化标配化,那就是Driver Monitoring System (DMS)驾驶员监控系统、Occupant Monitoring System (OMS)乘客监控系统和Camera Monitor System(CMS)摄像头监控系统。 汽车视觉技术的创新推动先进驾驶辅助系统的变革(ADAS),并…

力扣39. 组合总和

Problem: 39. 组合总和 文章目录 题目描述思路及解题方法复杂度Code 题目描述 思路及解题方法 该问题是组合问题的一个变体&#xff0c;可以归纳为元素无重复可复选问题&#xff0c;其代码的实现几乎和组合问题一模一样&#xff0c;由于在组合问题中我们只需要利用一个变量在递…

汽车电子与软件架构概述

汽车电子与软件架构概述 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师 (Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎,出门靠自己…

C语言 数据在内存中的存储

目录 前言 一、整数在内存中的存储 二、大小端字节序和字节序判断 2.1.练习一 2.2 练习二 2.3 练习三 2.4 练习四 2.5 练习五 2.6 练习六 三、浮点数在内存中的存储 3.1 浮点数存的过程 3.2 浮点数取的过程 总结 前言 数据在内存中根据数据类型有不同的存储方式&#xff0c;今…