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

目录

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,所以此题也是一个死循环

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

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

  

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

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

相关文章

STM32F4_软件模拟SPI

目录 1. 硬件连接 2. SPI通讯协议 3. W25Q64 简介 4. 程序详解 4.1 main.c 4.2 SPI.c 4.3 SPI.h 4.4 W25Q128.c 4.5 W25Q128.h 4.6 OLED.c 4.7 OLED.h 4.8 OLED_Font.h 5. 实验结果 我们都知道&#xff0c;SPI 和 IIC 一样&#xff0c;都可以通过硬件方式和软件方…

Phaser笔记-精灵(sprite)的使用

如下&#xff1a; 使用逻辑如下&#xff1a; ①设置好physics&#xff1b; ②将资源添加到spritesheet&#xff1b; ③在physics中添加sprite&#xff1b; ④创建anims&#xff1b; ⑤播放anims&#xff1b; 完整代码如下&#xff1a; import phaser;class PlayGame exte…

Linux 系统上的库文件生成与使用

1.库文件 库是一组预先编译好的方法的集合。Linux系统存储的库的位置一般在&#xff1a;/lib 和 /usr/lib。 在 64 位的系统上有些库也可能被存储在/usr/lib64 下。库的头文件一般会被存储在 /usr/include 下或其子目录下。 库有两种&#xff0c;一种是静态库&#xff0c;其…

springboot + vue3实现视频播放Demo(video.js Vue3-video-play视频播放器)

文章目录 学习链接前言ffmpeg安装ffmpeg配置环境变量分割视频文件 后台配置WebConfig 前端代码video.js示例安装依赖视频播放组件效果 Vue3-video-play示例安装依赖main.js中使用视频播放组件效果 学习链接 ffmpeg官网 长时长视频java存储及vue播放解决方法 【 攻城略地 】vue…

Packet Tracer - 配置区域策略防火墙

Packet Tracer - 配置区域策略防火墙 拓扑 地址表 设备 接口 IP地址 子网掩码 默认网关 交换机端口 R1 F0/1 192.168.1.1 255.255.255.0 N/A S1 F0/2 S0/3/0 (DCE) 10.1.1.1 255.255.255.252 N/A N/A R2 S0/3/0 10.1.1.2 255.255.255.252 N/A N/A S0/3…

C++ priority_queue

C priority_queue &#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;C &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容讲解了优先队列的对应接口的使用 文章目录…

[GUET-CTF2019]number_game[数独]

目录 题目 学到的知识点&#xff1a; 题目 在buu上看到了一道数独题&#xff0c;没见过&#xff0c;记录一下 下载附件&#xff0c;查壳&#xff0c;无壳&#xff0c;在IDA中打开&#xff0c;直接找到主函数 unsigned __int64 __fastcall main(int a1, char **a2, char **a3…

工程swift与OC混编改造

最近公司项目准备引入swift&#xff0c;由于目前工程已经完成了组件化不再是简单的单仓工程&#xff0c;所以需要进行混编改造。下面记录一下自己对工程进行混编改造的思考以及过程。 混编原理 看了很多文档&#xff0c;比较少有讲混编原理的&#xff0c;这里简单介绍一下语言…

springboot+springsecurity+jwt+elementui图书管理系统

​​图书管理系统​​ 关注公号&#xff1a;java大师&#xff0c;回复“图书”&#xff0c;获取源码 一、springboot后台 1、mybatis-plus整合 1.1添加pom.xml <!--mp逆向工程 --><dependency><groupId>org.projectlombok</groupId><artifactId&…

子串--子字符串 0528

210102 201012 A1A2…An An…A2A1 如何做&#xff0c; 翻转的是21&#xff0c;因为2>1; 翻转的是210&#xff0c;因为2>0; 翻转的是2101&#xff0c;因为2>1&#xff1b; 翻转的是21010&#xff0c;因为2>0&#xff1b; 翻转的是210102&#xff0c;因为22且1&…

2023-05-29 用 fltk gui库编写一个打字练习程序

用 fltk gui库编写一个打字练习程序 前言一、FLTK GUI 库二、使用步骤1.引入库2.使用代码 总结 前言 给孩子练习键盘打字, 发现终端还是欠点意思, 研究了一下gui, 最终用 fltk库弄了一个. 对于没有接触过gui的人, 发现, 编程的逻辑和终端区别很大, 很繁琐, 可能需要适应适应,…

0基础学习VR全景平台篇第32章:场景功能-嵌入视频

大家好&#xff0c;欢迎观看蛙色VR官方系列——后台使用课程&#xff01; 一、本功能将用在哪里&#xff1f; 嵌入功能可对VR全景作品嵌入【图片】【视频】【文字】【标尺】四种不同类型内容&#xff1b; 本次主要带来视频类型的介绍&#xff0c;通过嵌入视频功能&#xff0c;…

Go语言并发

Go语言并发学习目标 出色的并发性是Go语言的特色之一 • 理解并发与并行• 理解进程和线程• 掌握Go语言中的Goroutine和channel• 掌握select分支语句• 掌握sync包的应用 并发与并行 并发与并行的概念这里不再赘述, 可以看看之前java版写的并发实践; 进程和线程 程序、进程…

腾讯云服务器常用端口号大全以及端口开启方法

腾讯云服务器常用端口号如80、21、22、8080等端口&#xff0c;出于安全考虑一些常用端口默认是关闭的&#xff0c;腾讯云服务器端口如何打开呢&#xff1f;云服务器CVM在安全组中开启端口&#xff0c;轻量应用服务器在防火墙中可以打开端口&#xff0c;腾讯云百科来详细说下腾讯…

在云服务器上部署简单的聊天机器人网站(源1.0接口版)

诸神缄默不语-个人CSDN博文目录 又不是不能用.jpg http://47.113.197.198:8000/chat 集成代码可参考&#xff1a;花月与剑/scholar_ease 之所以先用源1.0&#xff0c;一是因为我API都申请了&#xff0c;不用白不用&#xff1b;二是因为源1.0可以直接用国内网络连接&#xf…

Vue登录界面精美模板分享

文章目录 &#x1f412;个人主页&#x1f3c5;Vue项目常用组件模板仓库&#x1f4d6;前言&#xff1a;&#x1f380;源码如下&#xff1a; &#x1f412;个人主页 &#x1f3c5;Vue项目常用组件模板仓库 &#x1f4d6;前言&#xff1a; 本篇博客主要提供vue组件之登陆组件源码…

idea连接Linux服务器

一、 介绍 配置idea的ssh会话和sftp可以实现对linux远程服务器的访问和文件上传下载&#xff0c;是替代Xshell的理想方式。这样我们就能在idea里面编写文件并轻松的将文件上传到linux服务器中。而且还能远程编辑linux服务器上的文件。掌握并熟练使用&#xff0c;能够大大提高我…

操作系统复习2.4.0-死锁详解

什么是死锁 各进程互相竞争对手里的资源&#xff0c;导致各进程都阻塞&#xff0c;都无法向前推进 死锁、饥饿、死循环的区别 死锁&#xff1a;各进程互相持有对方想要的资源且不释放&#xff0c;导致各进程阻塞&#xff0c;无法向前推进 饥饿&#xff1a;由于长期得不到想要…

四站精彩回顾 | Fortinet Accelerate 2023·中国区巡展火热进行中

Fortinet Accelerate 2023中国区巡展 上周&#xff0c;Fortinet Accelerate 2023中国区巡展分别走过青岛、南京、长沙、合肥四站&#xff0c;Fortinet携手太平洋电信、亚马逊云科技、中企通信等云、网、安合作伙伴&#xff0c;与各行业典型代表客户&#xff0c;就网安融合、网…

电动葫芦无法运转怎么办?

有关电动葫芦无法起动与运转故障&#xff0c;电动葫芦无法起动怎么办&#xff0c;有没有好的解决办法&#xff0c;检查电源熔丝是否烧断&#xff0c;定子绕组相间短路、接地或断路&#xff0c;以及是否负载过大或传动机械故障等。 电动葫芦无法运转故障怎么办 1、首先&#xf…