数据存储(整型数据存储)

news2025/2/27 19:21:01

目录

一、 数据类型详细介绍

1.类型的基本归类

二、 整形在内存中的存储

1.原码、反码、补码

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

三、大小端字节序介绍及判断

1、大端小端:

2、写出一个判断大小端的程序

四、练习整型存储

8个练习题 - 详解

五、整型计算总结

1、输入时:

        1)char类型,则要注意截断和整型提升

        2)signed 和 unsigned 则要注意如果有整型提升.

无符号unsigned类型 ,默认补位0

有符号signed类型,需要根据截断后的二进制,补符号位;

(例如:截断后10000000 则补位1;截断后00000001 则补位 0)

        3)如果为正数,补码即为二进制原码,不需要额外计算。

        4)如果为负数,需要 原码 反码 补码 计算

2、输出时

        1)%d 打印有符号十进制数,记得把计算的补码,还原为原码

        2)%u 打印无符号十进制数,补码即为结果


一、 数据类型详细介绍

 以及他们所占存储空间的大小。

类型的意义:
1. 使用这个类型开辟内存空间的大小(大小决定了使用范围)。
2. 如何看待内存空间的视角

1.类型的基本归类

 

 

二、 整形在内存中的存储

变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的。

1.原码、反码、补码

 

 

 

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

为什么呢?
        在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统 一处理;
        同时,加法和减法也可以统一处理( CPU只有加法器 )此外,补码与原码相互转换,其运算过程 是相同的,不需要额外的硬件电路。
int main()
{
	//内存里1-1=0
	int a = 1;
	int b = 1;
	int c = a - b;
	printf("%d\n", c);
	//看似是1减去1得到的0,实际上是1+(-1)得到0
	//1
	//00000000000000000000000000000001  - 1的补码
	
	//-1
	//10000000000000000000000000000001
	//11111111111111111111111111111110
	//11111111111111111111111111111111 - -1的补码

	//1+(-1)
		//00000000000000000000000000000001  - 1的补码
		//11111111111111111111111111111111 - -1的补码
		//100000000000000000000000000000000 - 1+(-1)的补码
	//丢掉高位得到 0
	//00000000000000000000000000000000 

	
	return 0;
}

三、大小端字节序介绍及判断

1、大端小端:

大端(存储)模式 ,是指数据的 低位 保存在内存的 高地址 中,而数据的 高位 ,保存在内存的 低地址 中;
小端(存储)模式 ,是指数据的 低位 保存在内存的 低地址 中,而数据的 高位 , ,保存在内存的 高地址
int main()
{
	int a = 20;
	//00000000000000000000000000010100  -  二进制补码
	//00 00 00 14 - 16进制       调试监视内存可以看到 14 00 00 00
	
	int b = -10;
	//10000000000000000000000000001010 -  二进制原码
	//11111111111111111111111111110101 - 反码
	//11111111111111111111111111110110 - 补码
	//ff ff ff f6 -16进制		调试监视内存可以看到f6 ff ff ff
	return 0;
}

 右边的地址:&b举例,可以看出地址是由低到高变化的,(f6的地址为E0后面依次为 E1, E2,E3,第二行开始cc的地址为E4。地址依次增大)

我们换算的补码顺序为           ff  ff  ff  f6  (f6为低位)

地址里存储的补码顺序为       f6  ff  ff  ff  (地址低到高变化的

        根据大小端的概念,我们发现低位 f6 存储在低地址处,高位 ff 存储在高地址处,所以推测我们目前使用的机器为小端存储

2、写出一个判断大小端的程序

/*
请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。(10分)
*/
int main()
{
	int a = 1;
	//00000000000000000000000000000001 - 1的二进制
	//00 00 00 01 - 1的16进制,内存显示的是这样
	//如果是小端存储 - 01 00 00 00
	//如果是大端存储 - 00 00 00 01
	//第一个字节就会不同,比较第一个字节就可以区分了

	char* pa = (char*)&a;
	int i = 0;
	//for (i = 0; i < 4; i++)
	//{
	//	printf("%d ", *pa);
	//	pa++;
	//}
	//1 0 0 0 - 小端存储

	if (*pa)
	{
		printf("小端存储\n");
	}
	else
	{
		printf("大端存储\n");
	}

	return 0;
}

 跟我们推测一致

四、练习整型存储
 

1.
int main()
{
	char a = -1;
	signed char b = -1;
	//char等同于siged char
	//10000000000000000000000000000001
	//11111111111111111111111111111110
	//11111111111111111111111111111111 - -1的补码
	//11111111 -  截断
	//整型提升 - 因为signed 有符号数,补符号位1 (11111111) 
	//11111111111111111111111111111111
	//11111111111111111111111111111110
	//10000000000000000000000000000001 - -1 的原码

	unsigned char c = -1;
	//10000000000000000000000000000001
	//11111111111111111111111111111110
	//11111111111111111111111111111111
	//11111111 - 截断
	//整型提升 - 因为unsigned char c是无符号整型,默认补0
	//00000000000000000000000011111111
	//由于最高位是0,为正数,正数的补码就是原码,于是转化为十进制就是 255
	printf("a=%d,b=%d,c=%d", a, b, c);//a=-1,b=-1,c=255
	return 0;
}

2.

int main()
{
	unsigned int num = -10;
	//10000000000000000000000000001010
	//11111111111111111111111111110101
	//11111111111111111111111111110110 - 补码
	printf("%d\n", num);//-10
	printf("%u\n", num);//打印无符号的十进制,符号位失去意义,当值数值计算了4294967286

	return 0;
}

 3.

int main()
{
	char a = -128;
	//10000000000000000000000010000000
	//11111111111111111111111101111111
	//11111111111111111111111110000000 - 补码
	//10000000 - 截断
	//整型提升 - 补符号位1 (10000000)
	//11111111111111111111111110000000 - 补码 
	
	printf("%u\n", a);//4294967168
	//打印无符号十进制数,则该补码的符号位没有意义,
	//变为数值位了,此时补码直接看作原码,化为十进制则为4294967168
	
	return 0;
}

4.

int main()
{
	char a = 128;
	//00000000000000000000000010000000
	//01111111111111111111111101111111
	//01111111111111111111111110000000 - 补码
	//10000000 - 截断
	//整型提升 - 有符号整型 补符号位1(10000000)
	//11111111111111111111111110000000 - 4294967168
	printf("%u\n", a);//4294967168

	return 0;
}

 

5.

int main()
{
	int i = -20;
	//10000000000000000000000000010100
	//11111111111111111111111111101011
	//11111111111111111111111111101100 -补码
	unsigned int j = 10;
	//00000000000000000000000000001010 - 10正数原反补相同
	//11111111111111111111111111101100 - -20
	//11111111111111111111111111110110 - 和(补码)
	//10000000000000000000000000001001
	//10000000000000000000000000001010 - -10(原码)
	
	printf("%d\n", i + j);//-10
	//按照补码的形式进行运算,最后格式化成为有符号整数
	return 0;
}

 

6.

int main()
{
	
	unsigned int i;
	//无符号整型,没有符号位,每一位都是数值
	for (i = 9; i >= 0; i--)
	{
		printf("%u\n", i);//死循环
		Sleep(1000);//为了方便看到每一步的变化,使用函数隔一秒打印
	}
	//9 8 7 6 5 4 3 2 1 0之后 i--得到-1
	//unsigned int i=-1
	//11111111111111111111111111111111 - -1的补码
	//由于无符号数,则该数的数值为4,294,967,295
	//以此类推i--得到-2
	//4,294,967,294
	return 0;
}

7.

int main()
{
	char a[1000];
	//char类型的取值范围-128~127 一共有255个数,
	//所以打印无法超过这个范围
	int i;
	for (i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
	}
	//-1 -2 -3 ...-128  127 126 ....3 2 1 0
	printf("%d", strlen(a));//255
	//求数组a的字符串长度,遇到'\0'就停止,'\0'的ASCII码值就是 0
	//数组最后一个元素 0 即 '\0'
	//从-128~127,一共255个元素,所以strlen(a)值为255
	return 0;
}

 

 8.

unsigned char i = 0;
//范围-128~127
int main()
{
	for (i = 0; i <= 255; i++)
	{
		printf("hello world\n");
	}
	//0~127打印hello world
	//128~255也可打印
	//unsigned char i = 128
	//10000000 -补码
	//unsigned char i = 255
	//11111111 -补码
	//当i++得到 unsigned char i=256时
	//100000000 截断得到 00000000
	//又变回了0,开始死循环
	return 0;
}

 

五、整型计算总结

        在计算时,我们要看输入的数据的类型(有符号 signed / 无符号unsigned 和 char 等是否要整型提升)以及数据的值(正负),还需要看是以怎样的形式输出的(有符号十进制%d  / 无符号十进制 %u)

1、输入时:

        1)char类型,则要注意截断整型提升

        2)signed 和 unsigned 则要注意如果有整型提升.

无符号unsigned类型 ,默认补位0

有符号signed类型,需要根据截断后的二进制,补符号位;

(例如:截断后10000000 则补位1;截断后00000001 则补位 0)

        3)如果为正数,补码即为二进制原码,不需要额外计算。

        4)如果为负数,需要 原码 反码 补码 计算

2、输出时

        1)%d 打印有符号十进制数,记得把计算的补码,还原为原码

        2)%u 打印无符号十进制数,补码即为结果

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

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

相关文章

基于微信公众号(服务号)实现扫码自动登录系统功能

微信提供了两种方法都可以实现扫描登录。 一种是基于微信公众平台的扫码登录&#xff0c;另一种是基于微信开放平台的扫码登录。 两者的区别: 微信开放平台需要企业认证才能注册&#xff08;认证费用300元&#xff0c;只需要认证1次&#xff0c;后续不再需要进行缴费年审&#…

Python制作9行最简单音乐播放器?不,我不满足

嗨害大家好鸭~我是小熊猫 好久不见啦~这次就来给大家整个大福利 ~ 源码资料电子书:点击此处跳转文末名片获取 最简单的9行代码音乐播放器如下&#xff1a; import time import pygamefile r歌曲路径 pygame.mixer.init() print(正在播放,file) track pygame.mixer.music.lo…

遗传算法及Python实现

0 建议学时 4学时 1 人工智能概述 2020中国人工智能产业年会在苏州召开&#xff0c;会上发布的《中国人工智能发展报告2020》显示&#xff0c;过去十年(2011-2020) &#xff0c;中国人工智能专利申请量达389571件&#xff0c;占全球总量的74.7%&#xff0c;位居世界第一。 报…

Power BI 数据处理介绍(数据初始调整、合并列及查看数据结构)

本系列的文章&#xff1a; 安装流程和示例介绍&#xff1a; 《Power BI windows下载安装流程&#xff09;》《Power BI 11个必学官方示例数据案例&#xff08;附下载链接&#xff09;》 数据导入阶段介绍&#xff1a; 《Power BI 数据导入&#xff08;SQL Server、MySQL、网页…

1802908-00-4,Dde Biotin-PEG4-alkyne,炔烃PEG4生物素Dde

Dde Biotin-PEG4-alkyne&#xff0c;Alkyne-PEG4-Biotin Dde&#xff0c;Dde 生物素-PEG4-炔烃&#xff0c;Dde 生物素PEG4炔基&#xff0c;炔烃PEG4生物素DdeProduct structure&#xff1a;Product specifications&#xff1a;1.CAS No&#xff1a;1802908-00-42.Molecular fo…

leetcode 540. Single Element in a Sorted Array(排序数组中的单个元素)

给一个已经排好序的升序数组&#xff0c;其中每个元素都会重复2次&#xff0c;只有一个元素只有一个&#xff0c; 找出这个只有一个的元素。 要求时间复杂度在O(logn), 空间复杂度在O(1). 思路&#xff1a; 时间复杂度为O(logn), 让人想到了binary search. 因为时间复杂度为…

keil5安装了pack包但是还是不能选择device

一开始&#xff0c;我以为是keil5无法安装 STM32 芯片包&#xff0c;打开device倒是可以看到stm公司的芯片包&#xff0c;但是没有我想要的stm32f1。 我按照网上的一些说法&#xff0c;找到了这个STM32F1 的pack芯片包&#xff0c;但是我双击安装的时候&#xff0c;它的安装位…

(HP)新手引导使用react-shepherd

1&#xff0c;官方参数文档&#xff1a;https://shepherdjs.dev/docs/tutorial-02-usage.html 2&#xff0c;基本代码 import { ShepherdTour } from react-shepherd; import ./index.less; // 自己的样式文件&#xff0c;用来修改样式 import ./shepherd.less; // 将shephe…

嵌入式C语言自我修养:从芯片、编译器到操作系统-习题、笔记

前沿 C语言测试(1):基本概念考查 什么是标识符、关键字和预定义标识符? 三者有何区别? 标识符&#xff08;Identifier&#xff09;:由程序员定义&#xff0c;用来表示变量&#xff0c;包括了变量名、函数名、宏名、结构体名等。 标识符的命名规范&#xff1a;C语言规定&…

Android架构设计——【 APT技术实现butterknife框架 】

APT简介 APT英文全称&#xff1a;Android annotation process tool是一种处理注释的工具&#xff0c;它对源代码文件进行检测找出其中的Annotation&#xff0c;使用Annotation进行额外的处理。 Annotation处理器在处理Annotation时可以根据源文件中的Annotation生成额外的源文…

100种思维模型之启发式偏差思维模型-017

曾国藩在给儿子的一封家书中曾写道&#xff1a;余于凡事皆用困知勉行工夫&#xff0c;尔不可求名太骤&#xff0c;求效太捷也。熬过此关&#xff0c;便可少进。再进再困&#xff0c;再熬再奋&#xff0c;自有亨通精进之日。 不急躁不求捷径&#xff0c;小火慢炖&#xff0c;将事…

burp小程序抓包

身为一名码农&#xff0c;抓包肯定是一项必备技能。工作中遇到很多次需要对小程序进行抓包排查问题。下面分享一下我的抓包方式&#xff0c;使用的是电脑版小程序抓包&#xff0c;跟手机的方式都差不多的。 一、环境 微信版本&#xff1a;3.6.0.18 Burpsuite版本&#xff1a…

Python容器

容器 容器是一种可以容纳多份数据的数据类型&#xff0c;容纳的每一份数据称之为1个元素&#xff0c;每一个元素&#xff0c;可以是任意类型的数据&#xff0c;如字符串、数字、布尔等。 数据容器根据特点的不同&#xff0c;如&#xff1a; 是否支持重复元素是否可以修改是否…

k8s1.17.2+centos7.7+docker18.06

1.简介 1.1pod网络 总述&#xff1a;Kubernetes 的网络模型假定了所有Pod都在一个可以直接连通的扁平的网络空间中 Flannel&#xff1a;基于L2&#xff0c;构建用于各个pod通信的网络架构。使用iptables进行数据包过滤。Calico&#xff1a;纯L3&#xff0c;构建用于各个pod通…

【Java基础】反射

概述 引入 package ref;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.IOException;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.r…

VUCA项目环境中如何提升项目进度计划与控制工作有效性的系统思考【一杯咖啡谈项目】

VUCA环境下&#xff0c;项目进度延迟是经常遇见的问题&#xff0c;如何解决此类问题&#xff1f;今天分享一个案例&#xff0c;在这个案例中&#xff0c;基于“根因分析法”&#xff0c;对某主题客户端项目的进度延迟问题进行了分析&#xff0c;找到根本原因&#xff0c;提出了…

鼠标指针文件格式解析

鼠标指针文件格式解析 文章目录鼠标指针文件格式解析windowsico文件格式分析文件头&#xff1a;图像数据头段&#xff1a;图像数据段&#xff1a;Ani动态光标格式解析数据结构&#xff1a;anihseq **rate**LISTcur静态光标文件格式解析macOSLinuxwindows ico文件格式分析 是一…

2023年PMP考试复习攻略

如何备考PMP呢&#xff1f; 这本书是PMP认证考试的官方教材&#xff0c;体系完善&#xff0c;可以迅速帮助入门者搭建项目管理知识体系&#xff0c;备考PMP考试的伙伴&#xff0c;这本书一定要读一遍&#xff01; 经验都是积累出来的&#xff0c;交流小队里有很多分享面试经验…

Vue3 中生命周期的使用

目录前言&#xff1a;一、什么是生命周期函数二、什么是 Keep-Alive 组件三、生命周期函数分为几种&#xff0c;分别有什么用&#xff1f;1. beforeCreate2. created3. beforeMount/onBeforeMount4. mounted/onMounted5. beforeUpdate/onBeforeUpdate6. updated/onUpdated7. be…

spring之事务概述

文章目录前言一、事务概述1、什么是事务2、事务的四个处理过程3、事务的四个特性二、引入事务场景1、引入依赖2、数据库创建3、建包4、spring.xml配置文件5、测试程序6、运行结果&#xff08;成功&#xff09;7、模拟异常三、Spring对事务的支持1、Spring实现事务的两种方式2、…