内存存储 | 整形在内存中怎么存储呢 | 原码反码补码 | 大小端

news2024/11/16 8:20:14

 整型在内存中的存储

整型在二进制中的表示形式有3种:原码、反码、补码。

  • 正的整数:原码、反码、补码相同
  • 负的整数:原码、反码、补码要进行计算的

整数在内存中存储的是补码的二进制序列。

其中对于有符号整形来说,二进制中最高位是符号位,最高位为“0”表示正数,最高位为“1”表示负数。

那么为什么在内存中存储的是补码呢?

使用补码、可以将符号位和数值域统一处理,同时,加法和减法也可以统一处理。在CPU中只有加法器,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

我们举个例子:

1-1

因为CPU中是只有加法器的,那么实现减法就是1+(-1)即可。

 1的补码:00000000 00000000 00000000 00000001

-1的补码:111111111 11111111 11111111 11111111

1+(-1):00000000 00000000 00000000 00000000

同理在执行乘法与减法中,就是多个数相加,多个数相减。

经过上面的例子,我们确实可以得到,存储的就是补码,但是为什么存储的顺序有些变动呢?

大小端的介绍

我们在创建变量时,操作系统就会给你分配空间,比如你创建了【short/int/double/float】的变量,这些变量的类型都是大于1个字节的,操作系统会根据你这个变量的类型,分配相应的内存空间,在空间分配好之后,在这块内存中进行存储这个变量,反正内存已经分好了,所以在这个内存中如何存储就不关操作系统的事情了。那么这个变量在它内存存储中,是从低地址到高地址呢?还是从高地址到低地址呢?

在一块给定的内存中,其实在内存中存储的时候,其实顺序是可以任意的。只要以你的方式存储进去,关键的是在你需要使用数据的时候,以你的方式原样返回即可。

简而言之,怎么存储其实并不重要,重要的是,你能够存进去并且取出来即可。

如下图,假设int a = 0x11223344,其实下面的这类种存储方式都是可以的,但是因为像类似下面这两个存储方式,在读取的时候,是极其不方便的,所以这之后的C语言发展的过程中,就将类似于下面的存储方式就不再继续使用了,最后就采用了这两种存储方式,一种是正着存储,一种是倒着存储。

这里这就分为了两种存储方式,大端字节序存储和小端字节序存储。 

大端字节序存储

大端字节序存储,就是将一个数据的低位字节处的数据存储到内存中高位字节的存储数据,将这个数据的高位字节处的数据存储到内存中低位字节的存储数据。

小端字节序存储

小端字节序存储,就是将一个数据的高位字节处的数据存储到内存中高位字节的存储数据,将这个数据的低位字节处的数据存储到内存中低位字节的存储数据。

而这里注意,在数据类型为char时,就不需要考虑存储顺序的问题,因为char类型的数据只占1个字节。

只有所占的字节数大于1字节的时候,比如short、int、double、float、long long等,我们才考虑存储顺序的问题。

那么为什么会出现大小端字节序的存储问题呢?

因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一字节为8比特位。但是在C语言中,除了有8比特位的char,还有16比特位的short,32比特位的long(具体需要根据编译器)。另外,对于16位、32位的处理器,由于寄存器是大于一个字节的,那么必然就会存在着如何将一个多字节存储安排的问题,这便导致了会有大小端字节序存储之分。

在学习完了大小端字节序存储之后,这里有一道关于它的笔试题:

百度在2015年系统工程师的笔试题:

请简述大端字节序存储和小端字节序存储的概念,并设计出一个程序来判断当前机器的字节序。

思路:

假如我们存储了int a=0,那么a的16进制就是0x 00 00 00 01。在这个数据中,01方向的是低位数数据,00方向的是高位数数据。那么,在这种情况下存储1,假设是小端字节序存储(高位数数据存储到高地址中),那么就是01存储到了高地址中,那么只要验证出低地址中取出的数等于1的话,那么就可以说明它就是小端字节序存储。如图:

代码:

#include <stdio.h>
int main()
{
	int a = 1;
	char* p = (char*)&a;//利用char类型1字节,来判断存储在低地址种的一字节的数据是何值
	if (*p == 1)
	{
		printf("小端");
	}
	else
	{
		printf("大端");
	}
	return 0;
}

下面有几个例题,我们来看一下:

整型存储相关例题

  • 下面代码的运行结果是什么:
#include <stdio.h>
int main()
{
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	
	printf("%d %d %d", a, b, c);
	return 0;
}

解析:

  • -1的补码:11111111 11111111 11111111 11111111
  • 上面的是-1在整型的存储方式,而char只占1个字节,所以char -1在计算机内存中存储的补码就是:11111111
  • %d是以十进制的形式打印有符号的整型
  • 但是现在是char类型,并不是整型类型,所以整型提升。
  • 整型提升的规则:对于有符号的数来说,整形提升补充的是它的符号位;而对于无符号整型来说补充的是0。
  • 又因为char类型在大多数的编译器上是有符号的,所以整型提升的是符号位。
  • 所以在打印出来的char a=-1的补码就是:11111111 11111111 11111111 11111111
  • 所以对应的整型就是-1,所以第一个值打印出来的结果是-1。

运行结果:

-1 -1 255

  •  下面代码的运行结果是什么:
#include <stdio.h>
int main()
{
	char a = -128;
	printf("%u\n", a);
}

 解析:

  • -128的补码:11111111 11111111 11111111 10000000
  • 但是上面的是整型的-128,整型占4个字节,而char类型只占1个字节,所以char -128在计算机内存中只能存储的补码为:10000000
  • %u是十进制的形式,打印无符号的整数;
  • 而现在这个-128不是整型类型,而是字符类型的,所以就需要整型提升;
  • 整型提升的规则:对于有符号的数来说,整形提升补充的是它的符号位;而对于无符号整型来说补充的是0。
  • 又因为char类型在大多数的编译器上是有符号的,所以整型提升的是符号位;
  • 所以在打印出来的char a=-128的补码就是:11111111 11111111 11111111 10000000
  • 而%u打印的是无符号的整数,所以整个二进制中的所有位都是有效位,没有符号位;
  • 所以对应的整型就是4,294,967,168,所以第一个值打印出来的结果是4,294,967,168。
  •  下面代码的运行结果是什么:
#include <stdio.h>
int main()
{
	char a = 128;
	printf("%u\n", a);
}

 解析:

  • 128的补码:00000000 00000000 00000000 10000000
  • 但是上面的是整型的128,整型占4个字节,而char类型只占1个字节,所以char128在计算机内存中只能存储的补码为:10000000
  • %u是十进制的形式,打印无符号的整数;
  • 而现在这个128不是整型类型,而是字符类型的,所以就需要整型提升;
  • 整型提升的规则:对于有符号的数来说,整形提升补充的是它的符号位;而对于无符号整型来说补充的是0。
  • 又因为char类型在大多数的编译器上是有符号的,所以整型提升的是符号位;
  • 所以在打印出来的char a=128的补码就是:11111111 11111111 11111111 10000000
  • 而%u打印的是无符号的整数,所以整个二进制中的所有位都是有效位,没有符号位;
  • 所以对应的整型就是4,294,967,168,所以第一个值打印出来的结果是4,294,967,168。
  •  下面代码的运行结果是什么:
#include <stdio.h>
int main()
{
	int i = -20;
	unsigned int j = 10;
	printf("%d\n", i + j);
}

 解析:

  • -20的补码:11111111 11111111 11111111 11101100
  • 10的补码:00000000 00000000 00000000 00001010
  • -20的补码+10的补码的结果补码:11111111 11111111 11111111 11110110
  • 原码:10000000 00000000 00000000 00001010

运行结果:-10

  •  下面代码的运行结果是什么:
#include <stdio.h>
int main()
{
	unsigned int i;
	for (i = 9; i >= 0; i--)
	{
		printf("%u\n", i);
		Sleep(1000);
	}
	return 0;
}

 

解析:

注意这里是无符号的char类型,任何一个无符号整数都是大于等于零的。无符号的那么它的每一位都是有效数字,在减到0之后,变为:

11111111 11111111 11111111 11111111

11111111 11111111 11111111 11111110

11111111 11111111 11111111 11111101

11111111 11111111 11111111 11111100

......

i这里一直被看做是整数并且i大于等于0,所以就进入了死循环中。

unsigned与signed的轮回:

 

  •  下面代码的运行结果是什么:
#include <stdio.h>
int main()
{
	char a[1000];
	int i = 0;
	for (i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d", strlen(a));
	return 0;
}

解析:

  • strlen统计的是“\0”之前出现的字符的个数
  • “\0”是一种以“\ddd”的形式的字符,它的ASCII码值为0
  • 所以此题也就是统计这个数组里面什么时候会遇到0
  • char在大多数编译器是有符号的,所以:
  • 运行过程为:-1 -2 -3 -4 -5 -6...-128 127 ...6 5 4 3 2 1
  • 128+127=255

运行结果:255

  •  下面代码的运行结果是什么:
#include <stdio.h>
unsigned char i = 0;
int main()
{
	for (i = 0; i <= 255; i++)
	{
		printf("hello world\n");
	}
	return 0;
}

解析:

无符号的char的取值范围为0~255

所以i<=255,所以死循环

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

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

相关文章

waf绕过——打狗棒法

前言 某狗可谓是比较好绕过的waf&#xff0c;但是随着现在的发展&#xff0c;某狗也是越来越难绕过了&#xff0c;但是也不是毫无办法&#xff0c;争取这篇文章给正在学习waf绕过的小白来入门一种另类的waf绕过。 环境的搭建&#xff1a; 环境的搭建就选择phpstudy2018安全狗最…

目标和00

题目链接 目标和 题目描述 注意点 只能向数组中的每个整数前添加 ‘’ 或 ‘-’返回可以通过上述方法构造的、运算结果等于 target 的不同 表达式 的数目1 < nums.length < 200 < nums[i] < 10000 < sum(nums[i]) < 10001000 < target < 1000 解答…

3.5 数据更新

思维导图&#xff1a; 3.5.1 插入数据 **数据更新操作笔记** --- **概述&#xff1a;** 数据更新操作在SQL中主要包括三种&#xff1a;插入、修改和删除。以下主要集中于插入数据的操作。 --- **3.5.1 插入数据&#xff1a;** **1. 插入单一元组&#xff1a;** - 格式&am…

MySQL-DCL数据控制语言简要介绍

MySQL-DCL数据控制语言简要介绍 一、简介二、用户操作1、创建用户2、修改用户密码3、删除用户 三、权限控制1、权限说明2、显示用户权限3、授予权限4、撤销权限 一、简介 在MySQL中&#xff0c;DCL代表数据控制语言&#xff08;Data Control Language&#xff09;。DCL用于管理…

开发者职场“生存状态”大调研报告分析 - 第三版

听人劝、吃饱饭,奉劝各位小伙伴,不要订阅该文所属专栏。 作者:不渴望力量的哈士奇(哈哥),十余年工作经验, 跨域学习者,从事过全栈研发、产品经理等工作,现任研发部门 CTO 。荣誉:2022年度博客之星Top4、博客专家认证、全栈领域优质创作者、新星计划导师,“星荐官共赢计…

spark中使用flatmap报错:TypeError: ‘int‘ object is not subscriptable

1、背景描述 菜鸟笔者在运行下面代码时发生了报错&#xff1a; from pyspark import SparkContextsc SparkContext("local", "apple1012")rdd sc.parallelize([[1, 2], 3, [7, 5, 6]])rdd1 rdd.flatMap(lambda x: x) print(rdd1.collect())报错描述如…

Fastadmin/Tp5.0连接多个数据库

第一步先引入Config use think\Config; 第二步读取数据库配置 $db Config::get(database2); //读取第二个数据库配置 第三步连接数据库 $db Db::connect($config); 第四步对数据库进行操作 $data $db->name(admin)->find(); 新建的database2.php就是把原database…

冲量在线荣获2023中关村科学城科创大赛成长组TOP10优秀项目!

2023年9月15日&#xff0c;由市科委、中关村管委会&#xff0c;市发展改革委&#xff0c;市经济和信息化局联合指导的2023中关村科学城科创大赛圆满落下帷幕&#xff0c;该项赛事聚焦人工智能大模型&#xff0c;互联网3.0等前沿领域&#xff0c;吸引了国内外近300个优质项目报名…

【开源三方库】Fuse.js:强大、轻巧、零依赖的模糊搜索库

开源项目 OpenHarmony 是每个人的 OpenHarmony 曹天恒 公司&#xff1a;中国科学院软件研究所 小组&#xff1a;知识体系工作组 1.简介 Fuse.js 是一款功能强大且轻量级的 JavaScript 模糊搜索库&#xff0c;支持 OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”…

vue3 自动下载使用 iconify图标以及自定义svg图标

开发中经常使用图标&#xff0c;通过unplugin-icons 插件我们可以在项目中自动下载所需的图标&#xff0c;但实际开发中我们还需要iconfont以及项目ui切图中的图标&#xff0c;这就需要使用自定义SvgIcon组件。具体操作步骤 一、安装包 npm i -D vite-plugin-svg-icons unplu…

Live800:未来的客户服务会发生哪些改变?

随着技术的不断进步和社会的不断发展&#xff0c;客户服务行业也在不断发生着变化。未来的客户服务将会发生哪些改变呢&#xff1f;以下是五个客户服务的预测&#xff0c;以期为企业的客服部门和经营者提供一些启示。 1、AI技术将会成为客户服务行业的核心 人工智能&#xff0…

冲量在线出席2023隐私计算大会,分享在大模型时代下隐私计算的最佳应用实践

隐私计算是数据要素可信流通的关键技术&#xff0c;是当下学术和产业研究的重要方向&#xff0c;也是助力我国数字经济发展的关键举措。为促进隐私计算发展&#xff0c;为隐私计算行业人群提供交流平台&#xff0c;7月26日&#xff0c;由中国信息通信研究院、中国通信学会联合主…

产品经理进阶:如何写商业计划书?

目录 简介 确定目标 确定目标市场 竞争分析 CSDN学院 作者简介 简介 很多时候&#xff0c;我们缺乏的并不是创意。 因为任何人都可能会萌发出一个好的创意。 但是&#xff0c;将想法变成可行的业务就完全是另一码事了。 你可能会认为你自己已经做好充分准备&#xff0…

vs2010 c++ 解析 json(jsoncpp)

vs2010 c 解析 json&#xff08;jsoncpp&#xff09; 在vs2010中利于jsoncpp库解析json&#xff0c;由于vs2010的版本过于古老&#xff0c;因此我们需要下载合适的jsoncpp版本。 下载jsoncpp 网址&#xff1a;https://github.com/open-source-parsers/jsoncpp/tags 选择合适的j…

用AIGC做私活真的太赚了...

说个小道消息&#xff0c;传统涨薪跳槽旺季即将结束&#xff0c;使用AIGC技术已然迎接私活的高潮期&#xff01;各行业对【AIGC】的需求在短时间内暴增。 估计圈子里的朋友都不会闲着&#xff0c;会趁着旺季赚一笔。 所以&#xff0c;近段时间知识星球很多粉丝朋友收到了很多…

html和css基础练习

vscode快捷键 alt b 在浏览器中打开 alt shift b 在其他浏览器打开 ctrl / 注释 ctrl y 快捷键删除 参考文章 https://www.bilibili.com/video/BV1m84y1w7Tb 基础html标签 img&#xff1a;图像&#xff0c;title&#xff1a;头部文字&#xff0c;body&#xff1a;主…

【喜报】冲量在线荣获首届“创领浦东”创新创业大赛三等奖!

为挖掘和培育更多具有浦东特色的优秀创业代表&#xff0c;深耕人才创新创业沃土。2023年&#xff0c;浦东新区人力资源和社会保障局、浦东新区就业促进中心聚合三大赛事品牌&#xff0c;联手打造升级版赛事IP——首届“创领浦东”创新创业大赛。 经过初选、复选、决赛三轮评审…

让视频更加完美——Adobe Premiere Pro 2024 (Pr2024)正式发布!

如果您是一名视频制作人员&#xff0c;或者是想把自己的视频制作得更加完美的业余爱好者&#xff0c;那么您一定听说过Adobe Premiere Pro。Adobe Premiere Pro是一款功能强大、稳定可靠的视频编辑软件&#xff0c;被广泛应用于电影、电视、广告等行业。 现在&#xff0c;好消…

Bootstrap-- 媒体特性

最大、最小宽度例子&#xff1a; 横屏与竖屏例子&#xff1a; 宽度比与像素比例子&#xff1a;

C#:画许多圆

C#:画许多圆 //画许多圆 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace Test_21 {…