数据在内存中的存储(1)——整形

news2024/11/24 15:50:19

目录

1、数据类型介绍

        1.1、类型的基本归类

                整形家族

                浮点数家族

                指针类型

                空类型

                构造类型

2、整形在内存中的存储

         2.1、原码、反码、补码

         2.2、大小端介绍

         2.3、有符号与无符号 

         2.4、练习

        例一

        例二

        例三

        例四

        例五 


1、数据类型介绍

我们先来简单了解一下我们前面所学的基本的内置类型

数据类型数据名占内存字节数表示范围
char字符数据类型1-128~127
short短整型2-32,768~32,767
int整形4-2,147,483,648~2,147,483,647(-231 ~ 231-1)
long长整型4或者8-2,147,483,648~2,147,483,647(-231 ~ 231-1)
long long更长的整形8-9223372036854775808~9223372036854775807
float单精度浮点数4-3.4x10-38 ~ 3.4x1038
double双精度浮点数8-1.7x10-308 ~ 1.7x10308

这么多类型存在的意义在于使用者可以选择自己所需要合适的类型

 

        1.1、类型的基本归类

根据这些数据类型,我们给他们做一个简单的分类

                整形家族

char

unsigned  char

signed  char

short

unsigned  short

signed  short

int

unsigned  int

signed  int

long

unsigned  long

signed  int

这里char为什么放在整形家族里呢?是因为字符在存储的时候,存储的是ASCII码值,是整型,所以放在整型家族里,蓝色为无符号,紫色为有符号后续会讲到,这儿保留悬念

                浮点数家族

                                            float
                                           double

                指针类型

   关于指针有疑问的小伙伴可以去看看博主对指针的讲解

char*  pc
int*   pi
float*  float
void*  pv

                  空类型

void表示空类型(无类型)
通常用于函数的参数、函数的返回类型、指针类型

                构造类型

数组类型
结构体类型
枚举类型
联合类型

2、整形在内存中的存储

 一个变量的创建是需要在内存中开辟空间的,而空间的大小是根据不同的类型来决定的。数据在这些空间中以二进制补码的形式存储,而计算机中有符号数有原码,反码,补码三种表示形式,并且还有符号位和数值位,符号位用0表示正数,1表示负数

         2.1、原码、反码、补码

我们这里用的是整型,而一个整形有4个字节=32bit位,所以二进制表示应为32位,第一位为符号位,1表示负数,0表示正数,中间用0补齐就好,正整数的原码、反码、补码表示如下

int a = 15;
//00000000000000000000000000001111 - 原码
//00000000000000000000000000001111 - 反码
//00000000000000000000000000001111 - 补码

 负整数的原码、反码、补码是需要计算的,计算方法和原码、反码、补码表示如下

int b = -15;
//10000000000000000000000000001111 - 原码
//11111111111111111111111111110000 - 反码(原码的符号位不变,其他位按位取反得到的就是反码)
//11111111111111111111111111110001 - 补码(反码+1就是补码)

  我们还需要明确的是整数在内存中存储的是补码,计算的时候也是使用补码计算的

         2.2、大小端介绍

在介绍大小端是我们先来看几组现象,有助于我们理解,博主这里使用的编译器为vs2019

 但我们查看num的地址我们发现,数据在上面倒着存储,这是正数,我们再来看一下负数 

我们发现还是倒着存储的,这是为什么呢?

这是因为大端和小端这两种存储模式

      大端:是数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。低地址-->>高数据   例如:手机

      小端:是指数据的地位保存在内存的低地址中,数据的高位则保存在内存的高地址中。低地址-->>低数据    例如:电脑

这里呢我们想一下,除了通过调试,我们还有没有其他办法来判断大小端呢?

这里我们发现,当a=1时,大小端低位存储的值并不相同,所以我们写出以下代码

//int main()
//{
//	int a = 1;
//	char* p = (char*)&a;
//	if (*p == 1)
//		printf("小端\n");
//	else
//		printf("大端\n");
//	return 0;
//}

那么这个代码又是如实现的呢? 这里我们需要明确一个知识点,其实这个博主在指针是也有所讲到,这里就在浅提一下吧

那么也就是所如果是访问的第一个字节是1那么就是小端,如果不是就是大端,如此一来就可以判断了

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

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

大小端存在的意义

1)在通信协议中,大小端模式是非常重要的。

2)在实际中,有些CPU用的是大端,有些则是小端,如不加以区别的话,可能会出现读取时和储存时字节顺序不一致的情况,从而造成数据的错误。

3)网络通信中一般为大端模式,常用计算机CPU为小端模式。


         2.3、有符号与无符号 

     这里注意有符号和无符号只针对整形

在博主vs编译器上类型前面没有加unsigned都默认为有符号

我们知道数据在存储时是以二进制存储的,而二进制位的第一位为符号位,我们来看一个简单的演示再理解一下有符号和无符号

那么有符号与无符号对于我们的表示范围有没有区别呢?答案是显然的,有区别的

比如我们先来看一下有符号的吧

再来看一下无符号的,没有符号位,全是数值位

这里呢我们再拓展一下,当二进制位不断加一时,我们会发现到了极限时,又会回到最初位,这里我们借用大牛的图来理解一下

有符号的 

无符号的

         2.4、练习

例一

下面是代码解释和最终结果 

//#include <stdio.h>
//int main()
//{
//	char a = -1;
//	//10000000000000000000000000000001  原码
//	//11111111111111111111111111111110  反码
//	//11111111111111111111111111111111-截断,因为char只占一个字节
//	//11111111 -a
//	//11111111111111111111111111111111  整形提升
//	//11111111111111111111111111111110  反码
//	//10000000000000000000000000000001--> -1
//
//	signed char b = -1;
//	//11111111111111111111111111111111  反码
//	//11111111 -b
//	//11111111111111111111111111111111  整形提升
//	//11111111111111111111111111111110  反码
//	//10000000000000000000000000000001--> -1
//	unsigned char c = -1;
//	//11111111 -c   //无符号,前面补0
//	//00000000000000000000000011111111--.255
//	//
//	printf("a=%d,b=%d,c=%d", a, b, c);
//	//%d - 十进制的形式打印有符号整型整数
//	//整型提升
//
//	return 0;
//}

关于整形提升不懂的宝子,可以看博主在操作符(2)里的讲解 

 例二

 

 代码解释与运行结果如下

//#include <stdio.h>
//int main()
//{
//	char a = -128;
//	//-128
//	//10000000000000000000000010000000
//	//11111111111111111111111101111111
//	//11111111111111111111111110000000
//	//-128的补码
//	//10000000 有符号,补首位
//	//11111111111111111111111110000000
//	//由于我们打印的是无符号,所以上面就为我们要的原码
//	printf("%u\n", a);
//  %u打印无符号的十进制数
//	return 0;
//}

例三

 

解释如下

//int main()
//{
//	int i = -20;
//	//10000000000000000000000000010100
//	//11111111111111111111111111101011
//	//11111111111111111111111111101100
//	//
//	unsigned int j = 10;
//	//00000000000000000000000000001010 -->10
//	//11111111111111111111111111101100 -->-20
//	//11111111111111111111111111110110
//	//11111111111111111111111111110101
//	//10000000000000000000000000001010 -10
//	//
//	//11111111111111111111111111110110
//	//10000000000000000000000000001001
//	//10000000000000000000000000001010
//	printf("%d\n", i + j);
//	return 0;
//}

 例四

 这里呢由于我们 i 是unsigned int,所 i 是恒大于0的,所以这个函数为死循环

例五 

//unsigned char i = 0;//0~255
//
//int main()
//{
//	for (i = 0; i <= 255; i++)
//	{
//		printf("hello world\n");
//	}
//	return 0;
//}

 这里同理,无符号char取值范围为0~255,所以此题也是一个死循环

关于浮点数,博主会在下一篇进行介绍。

制作不易,记得一件三连哦!!!

  

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

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

相关文章

【腾讯云Finops Crane集训营】降本增效之 Crane 初体验

1. Crane 初识2. Crane 如何进行成本优化&#xff1f;3. Crane 快速上手体验3.1 安装 Prometheus 和 Grafana3.2 安装 Crane 和 Fadvisor3.3 验证安装是否成功3.4 访问 Dashboard 4. Crane 初体验 - 总结&建议5. 关于腾讯云 Finops Crane 集训营 最近有幸参加了腾讯云 Fino…

新星计划【Java微服务+云原生】赛道开启!

前排提醒&#xff1a;这里是新星计划2023【微服务云原生】学习方向的报名入口&#xff0c;一经报名&#xff0c;不可更换。 ↓↓↓报名入口&#xff1a;新星计划2023【微服务云原生】学习方向报名入口&#xff01;-CSDN社区 一、关于本学习方向导师 博客昵称&#xff1a;鹤冲…

opengl灯光基础:2.1 光照基础知识

光照&#xff1a; 光照以不同的方式影响着我们看到的世界&#xff0c;有时甚至是以很戏剧化的方式。当手电筒照射在物体上时&#xff0c;我们希望物体朝向光线的一侧看起来更亮。我们所居住的地球上的点&#xff0c;在中午朝向太阳时候被照得很亮&#xff0c;但随着地球的自转…

【使用VS开发的第一个QT项目——实现相机功能(包括QT下载、配置、摄像头程序)】

使用VS开发的第一个QT项目 一、QT(WIN10)安装1.首先下载QT(VS有对应的QT)2.安装QT 二、将QT加载到VS中三、QT设置1.在VS"Qt Vs Tools"→"QT Versions"中添加"msvc2017_64"qmake的路径2.在"General"→"QT Designer"中将"…

克里金插值(Kriging)在MATLAB中的实现【优化】

该部分是基于克里金插值&#xff08;Kriging&#xff09;在MATLAB中的实现&#xff08;克里金工具箱&#xff09;&#xff0c;由于在运行过程中有部分问题&#xff0c;基于此做的一些理解优化。 工具箱的下载见上面的链接&#xff0c;其提供了工具箱。 clc clearload(data_kr…

服务(第三十二篇)nginx做缓存服务器

nginx作为缓存服务配置语法 1、proxy_cache_path 配置语法&#xff08;即缓存路径配置语法&#xff09; Syntax&#xff1a;proxy_cache_path path [levelslevels] [use_temp_pathon|off] keys_zonename:size [inactivetime] [max_sizesize] [manager_filesnumber] [manager_s…

python爬虫笔记

Python爬虫笔记 一. Urllib 1. 基础请求 指定url请求返回值解码返回结果的一些操作 import urllib.request as req # 定义一个url url http://www.baidu.com# 发送请求获得相应 res req.urlopen(url)# read返回字节形式的二进制数据,需要用指定编码来解码 content res.r…

Allure测试报告定制全攻略,优化你的Web自动化测试框架!

目录 前言&#xff1a; 1. Allure测试报告简介 2. Web自动化测试框架简介 3. 封装Web自动化框架 3.1 安装Selenium 3.2 封装Selenium 3.3 定制Allure测试报告 3.3.1 适配翻译插件 3.3.2 定制测试报告样式 4. 示例代码 5. 总结 前言&#xff1a; 随着现在Web应用的普…

【特征选择】基于二进制粒子群算法的特征选择方法(PNN概率神经网络分类)【Matlab代码#33】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. 特征选择问题2. 二进制粒子群算法3. 概率神经网络&#xff08;PNN&#xff09;分类4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第6节&…

day42_jsp

今日内容 零、 复习昨日 一、JSP 二、EL 三、JSTL 四、MVC 零、 复习昨日 一、JSP 1.0 引言 现有问题 在之前学习Servlet时&#xff0c;服务端通过Servlet响应客户端页面&#xff0c;有什么不足之处&#xff1f; 开发方式麻烦&#xff1a;继承父类、覆盖方法、配置Web.xml或注…

8.3:加强堆的应用

8.3&#xff1a;加强堆的应用 题目要求&#xff1a; 做一个加强堆的题目&#xff0c;给定一个整型数组&#xff0c;int[] arr&#xff1b;和一个布尔类型数组&#xff0c;boolean[] op 两个数组一定等长&#xff0c;假设长度为N&#xff0c;arr[i]表示客户编号&#xff0c;op…

【程序人生】上海城市开发者社区小聚有感

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;2022年度博客之星全国TOP3&#xff0c;专注于后端、中间件、计算机底层、架构设计演进与稳定性建设优化&#xff0c;文章内容兼具广度、深度、大厂技术方案&#xff0c;对待技术喜欢推理加验证&#xff0c;就职于…

shell脚本入门-编写格式以及执行方式

Shell介绍 通过编写shell命令发送给linux内核去执行&#xff0c;操作就是计算机硬件&#xff0c;所以Shell命令是用户操作计算机硬件的桥梁 Shell是命令&#xff0c;类似与windows系统的Dos命令 Shell是一门程序设计语言&#xff0c;shell里面含有变量&#xff0c;函数&#xf…

低代码助力企业数字化转型:构建高效业务系统的新选择

在当今数字化时代&#xff0c;企业数字化转型已经成为业界的热门话题。随着全球各大企业逐渐意识到数字化转型的重要性&#xff0c;越来越多的公司开始采用低代码开发平台作为数字化转型的工具&#xff0c;以低成本高效率构建业务系统&#xff0c;实现数字化转型。 但现实情况是…

Less基础速学 —— 混入、运算、继承

Less 混合 在上一篇内容中就已经简单的了解了关于CSS预处理器 —— Less&#xff0c;本篇就往下讲Less中的混合&#xff0c;什么是混合&#xff1f;就是将一系列属性从一个规则集引入到另外一个规则集的方式。下面来看一下它的混合方式有哪些&#xff1f; 普通混合 <div …

使用OpenCvSharp来计算图像的清晰度(可实现相机自动对焦)

相机自动对焦&#xff0c;其实是对相机成像的清晰值得计算&#xff0c;若对焦不清晰&#xff0c;成像的清晰度低&#xff0c;视觉效果模糊。若是在工业检测行业&#xff0c;对焦不准确&#xff0c;可能导致信息不正确&#xff1b;对焦准确的图像&#xff0c;其清晰度高&#xf…

长连接心跳原理与机制工程上踩坑与优化

QA: 业务上对于心跳间隔一般怎么确定? 心跳间隔的确定一般需要根据具体业务场景和需求来进行。以下是一些常见的确定心跳间隔的方法&#xff1a; 根据应用场景和需求来确定心跳间隔。例如&#xff0c;在智能手环等健康监测设备中&#xff0c;心跳间隔通常设置为几秒钟到几分钟…

华为OD机试之过滤组合字符串(Java源码)

过滤组合字符串 题目描述 每个数字关联多个字母&#xff0c;关联关系如下&#xff1a; 0 关联 “a”,”b”,”c”1 关联 “d”,”e”,”f”2 关联 “g”,”h”,”i”3 关联 “j”,”k”,”l”4 关联 “m”,”n”,”o”5 关联 “p”,”q”,”r”6 关联 “s”,”t”7 关联 “u”…

六级备考24天|CET-6|翻译技巧4|翻译红楼梦|22:40~23:40

目录 作题步骤 红楼梦 12 PRACTICE ANSWER​ 时态问题 3 ANSWER 4 PRACTICE ANSWER ​ 5​ PRACTICE ANSWER 合并 ​ 全文翻译​ 作题步骤 不要拿到题目就动笔、一定要先读题、重建逻辑、找句子主干、有能力可以润色简化&#xff01; 红楼梦 12 PRACTICE Dream of th…

【java】leetcode 二叉树展开为链表

二叉树展开为链表 leetcode114 .二叉树展开为链表解题思路二叉树专题&#xff1a; leetcode114 .二叉树展开为链表 114 leetcode 链接。可以打开测试 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#x…