整形在内存中的存储(例题逐个解析)

news2025/3/18 12:56:54

目录

一.相关知识点

1.截断:

2.整形提升:

3.如何 截断,整型提升?

(1)负数

(2)正数

(3)无符号整型,高位补0

注意:提升后得到的是补码。要根据打印类型,判断是否有符号位;有效数字

二.例题

1.

2.

3.

4.

疑问:不应该算数转换为unsigned int 吗?

5.

6.


一.相关知识点

1.截断:

直接保留低位的二进制位

2.整形提升:

表达式中的字符(char)短整形(short)操作数在使用之前被转换为普通整型(int),这种转换称为整型提升

3.如何 截断,整型提升?

整型提升是按照变量的数据类型的符号位来提升的

(1)负数
char c1 = -1;

截断:-1的补码为:11111111111111111111111111111111 。 -1为int占4字节,c1是char占1字节。

         直接保留 int 所占4字节中低位的1字节的二进制位:11111111

整型提升:因为 char 为 signed char 。所以整形提升的时候,高位补充符号位,即为1

                 提升后的结果为:11111111111111111111111111111111

(2)正数
char c2 = 1;

截断:1的补码为:00000000000000000000000000000001 。1为int占4字节,c1是char占1字节。

           直接保留 int 所占4字节中低位的1字节的二进制位:00000001

整型提升:因为 char 为 signed char 。所以整形提升的时候,高位补充符号位,即为0

                 提升后的结果为:00000000000000000000000000000001

(3)无符号整型,高位补0

注意:提升后得到的是补码。要根据打印类型,判断是否有符号位;有效数字

二.例题

1.

int main()
{
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;

	printf("a=%d,b=%d,c=%d", a, b, c);

	return 0;
}

题解:

int main()
{
	char a = -1;
	//-1 是整数,32bit
	//11111111111111111111111111111111   (int)-1的补码
	//11111111 - char a 截断
	//11111111111111111111111111111111   提升(得到补码)
	
	signed char b = -1; //和a等价
	unsigned char c = -1;
	//11111111111111111111111111111111   (int)-1的补码
	//11111111 - char a 截断
	//00000000000000000000000011111111 - 提升,无符号的整型,高位补0
	// 
	//      -1    -1   255
	printf("a=%d,b=%d,c=%d", a, b, c);
	//%d是打印有符号的整数
	
	return 0;
}

2.

int main()
{
	char a = -128;
	printf("%u\n", a);
    //%u 打印无符号整型

	return 0;
}

题解:

int main()
{
	char a = -128;
	//10000000000000000000000010000000
	//11111111111111111111111101111111
	//11111111111111111111111110000000 - 128的补码
	//10000000 - a
	//11111111111111111111111110000000
	
	//%u - 第一位不是符号位
	printf("%u\n", a);//4294967168

	return 0;
}

3.

int main()
{
	char a = 128;
	printf("%u\n", a);
	return 0;
}

题解:

int main()
{
	char a = 128;
	//00000000000000000000000010000000 - 128的补码
	//10000000 - a
	//11111111111111111111111110000000
	
	printf("%u\n", a);//4294967168
	return 0;
}

4.

int main()
{
	int i = -20;
	unsigned int j = 10;

	printf("%d\n", i + j);

	return 0;
}

题解:

int main()
{
	int i = -20;
	unsigned int j = 10;
	//10000000000000000000000000010100 - -20的原码
	//11111111111111111111111111101011 - -20的反码
	
	//11111111111111111111111111101100 - -20的补码
	//00000000000000000000000000001010 -  10的补码
	//11111111111111111111111111110110 - 和的补码
	//11111111111111111111111111110101 - 和的反码
	//10000000000000000000000000001010 - 和的原码
	
	printf("%d\n", i + j);//-10

	return 0;
}
疑问:不应该算数转换为unsigned int 吗?

如果这样,根据和的反码,第一位不是符号位,结果为4294967286

但是,我们是以 %d 形式打印的,如果是以 %u 打印,确实是4294967286。

我以 %d(有符号的整数) 的形式打印,我就认为内存里存的是有符号数。

        %u                                               我就认为内存里存的是无符号数。

理论上说,i+j 结果确实是无符号数。但是你是个无符号数也悠不住我用 %d 来打印。

一个数据放在内存里,它有无符号没法确定,是用的人决定它有无符号

从哲学角度来说,一个东西是什么,取决于看待的人的视角

5.

(1)
int main()
{
	unsigned int i;
	for (i = 9; i >= 0; i--)
	{
		printf("%u\n", i);
	}

	return 0;
}

由于 i 是 unsigned int ,所以 i 不论怎么减,都不会 > 0 。

我们这样演示:

#include <windows.h>
int main()
{
	unsigned int i;
	for (i = 9; i >= 0; i--)
	{
		printf("%u\n", i);
		Sleep(1000);
	}

	return 0;
}

(2)
int main()
{
	char a[1000];
	int i;
	for (i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d", strlen(a));

	return 0;
}

strlen 统计 ' \0 ' 之前的个数,' \0 ' 的ASCII码值为0 。所以本题是想让你判断,什么时候 a 里放第一个0

char 大多数是 signed char 其取值范围为 -128~127

所以放到 a 里的数字依次是:-1  -2  -3 ...... -127  -128  127  126  ...... 2  1  0  -1  -2  ......

到 0 之前是 128+127=255,结果就是255

(3)
unsigned char i = 0;//0~255

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

i <= 255 的判断进入循环条件一直成立,循环不会停下来,一直打印 hello world

6.

int main()
{
	char a = 3;
	char b = 127;
	char c = a + b;
	printf("%d", c);

	return 0;
}

题解:

int main()
{
	//char --> signed char
	char a = 3;
	//00000000000000000000000000000011
	//截断
	//00000011 - a
	
	char b = 127;
	//00000000000000000000000001111111
	//截断 
	//01111111 - b

	char c = a + b;
	//00000011
	//01111111
	//整型提升
	//00000000000000000000000000000011
	//00000000000000000000000001111111
	//00000000000000000000000010000010 - 和的补码
	// 截断
	//10000010 - c
	printf("%d\n", c);//-126
	//%d 是打印十进制的整数
	//11111111111111111111111110000010 - 补码
	//11111111111111111111111110000001
	//10000000000000000000000001111110 - 原码
	//-126
	return 0;
}

本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注

小编会以自己学习过程中遇到的问题为素材,持续为您推送文章

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

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

相关文章

蓝牙系统的核心组成解析

一、硬件层&#xff1a;看得见的物理载体 1. 射频模块&#xff08;Radio Frequency Module&#xff09; 专业描述&#xff1a;工作在2.4GHz ISM频段&#xff0c;支持GFSK/π/4 DQPSK/8DPSK调制方式 功能类比&#xff1a;相当于人的"嘴巴"和"耳朵" 发射端…

uniapp笔记-底部和首部标签页菜单生成

逻辑 这些都是需要配置pages.json文件。 其中底部需要手动配置tarBar&#xff0c;如&#xff1a; "tabBar": {"list":[{"pagePath": "pages/index/index","text": "首页"},{"pagePath": "pages/…

SpringBoot 和vue前后端配合开发网页拼图10关游戏源码技术分享

今天分享一个 前后端结合 的网页游戏 开发项目源码技术。 这也是我第一次写游戏类的程序&#xff0c;虽然不是特别复杂的游戏&#xff0c;但是是第一次写&#xff0c;肯定要记录一下了&#xff0c;哈哈。 游戏的内容 就是 我们显示中玩的那个 拼图碎片的 游戏&#xff0c;类似下…

OpenCV计算摄影学(21)非真实感渲染之边缘保留滤波器edgePreservingFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 滤波是图像和视频处理中的基础操作。边缘保留平滑滤波器被广泛应用于多种不同场景[98]。 cv::edgePreservingFilter 是一种边缘保留滤波器&#…

JVM并发编程AQSsync锁ReentrantLock线程池ThreadLocal

并发编程2 synchronized锁实现**AQS****ReentrantLock实现****JUC 常用类**池的概念 ThreadLocalThreadLocal原理内存泄露强引用:软引用弱引用虚引用ThreadLocal内存泄露 synchronized锁实现 synchronized是一个关键字,实现同步,还需要我们提供一个同步锁对象,记录锁状态,记录…

什么是数学建模?数学建模是将实际问题转化为数学问题

数学建模是将实际问题转化为数学问题&#xff0c;并通过数学工具进行分析、求解和验证的过程。 一、数学建模的基本流程 问题分析 • 明确目标&#xff1a;确定需要解决的核心问题。 • 简化现实&#xff1a;识别关键变量、忽略次要因素。 • 定义输入和输出&#xff1a;明确模…

唤起“队列”的回忆

又来博客记录自己的学习心得了&#xff0c;嘿嘿嘿(^&#xff5e;^) 目录 队列的概念和结构&#xff1a; 队列的创建和初始化&#xff1a; 队列入栈&#xff1a; 队列出栈&#xff1a; 队列的销毁&#xff1a; 取队头和队尾数据&#xff1a; 结语&#xff1a; 队列的概念…

Linux(8.4)NFS

文章目录 一、概念二、详解NFS1&#xff09;软件名2&#xff09;服务名3&#xff09;配置文件4&#xff09;端口号5&#xff09;相关命令 三、部署NFS一、NFS服务端1&#xff09;**配置源&#xff08;本地或者网络源&#xff09;**2&#xff09;2、安装NFS**3&#xff09;启动服…

【位运算】速算密钥:位运算探秘

文章目录 前言例题一、判定字符是否唯一二、丢失的数字三、两整数之和四、只出现⼀次的数字 II五、消失的两个数字 结语 前言 什么是位运算算法呢&#xff1f; 位运算算法是以位运算为核心操作&#xff0c;设计用来高效解决特定问题的一系列计算步骤集合。它巧妙利用位运算直接…

STM32G070CBT6读写FLASH中的数据

向FLASH中写入数据函数 /*函数说明&#xff1a;向FLASH中写数据形参&#xff1a;addr-要写入数据的起始地址 data-准备写入数据 len-数据大小返回值&#xff1a;1-成功&#xff0c;0-失败 */ uint8_t FlashWriteData(uint64_t addr,uint8_t data[],size_t len) {uint32_t Fir…

AD绘图基本操作

一、基本操作 注意&#xff1a;快捷键都要在英文模式下才能生效 1、移动 按住鼠标右键移动 2、切换桌面栅格距离 G 3、英寸和毫米 尺寸切换 Q 4、元件在3D模式下的移动 3D视角鼠标左键只起到选择元器件并移动之的功能&#xff0c; 单纯鼠标右键只能平移桌面 shift鼠…

dfs(十二)21. 合并两个有序链表 递归解决

21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]示例 2&#xff1a; 输入&#xff1a;l1 [], l2 [] …

51单片机指令系统入门

目录 基本概念讲解 一、机器指令​ 二、汇编指令​ &#xff08;一&#xff09;汇编指令的一般格式 &#xff08;二&#xff09;按字节数分类的指令 三、高级指令 总结​ 基本概念讲解 指令是计算机&#xff08;或单片机&#xff09;中 CPU 能够识别并执行的基本操作命令…

安全无事故连续天数计算,python 时间工具的高效利用

安全天数计算&#xff0c;数据系统时间直取&#xff0c;安全标准高效便捷好用。 笔记模板由python脚本于2025-03-17 23:50:52创建&#xff0c;本篇笔记适合对python时间工具有研究欲的coder翻阅。 【学习的细节是欢悦的历程】 博客的核心价值&#xff1a;在于输出思考与经验&am…

如何玩DeepSeek!15分钟快速创建GIS动态数据可视化仪表盘

DeepSeek最近火遍全球&#xff0c;大家用的都用的不亦乐乎。国外呢&#xff1f;当然也是&#xff0c;最近一上YouTube、X等都是deepseek的推送。 今天介绍一下&#xff0c;我在YouTube上看到的GIS行业与DeepSeek结合的一个案例&#xff1a; 快速轻松构建交互式地图仪表盘&…

课上测试:MIRACL共享库使用测试

MIRACL(MultiprecisionIntegerandRationalArithmeticC/cLibrary)是著名的密码算法库&#xff0c;设法去官网下载安装MIRACL&#xff0c;提交安装过程截图或过程文本&#xff08;3分&#xff09;. 去github官网下载.zip文件 使用如下命令进行解压 unzip -j -aa -L MIRACL-mast…

网络编程知识预备阶段

1. OSI七层模型 OSI&#xff08;Open System Interconnect&#xff09;七层模型是一种将计算机网络通信协议划分为七个不同层次的标准化框架。每一层都负责不同的功能&#xff0c;从物理连接到应用程序的处理。这种模型有助于不同的系统之间进行通信时&#xff0c;更好地理解和…

STM32微控制器_03_GPIO原理与应用

核心内容 STM32 GPIO基本原理&#xff08;熟悉&#xff09;GPIO输出功能HAL库编程实现的应用&#xff08;重点&#xff09;GPIO输入功能HAL库编程实现的应用&#xff08;重点&#xff09; 一.STM32 GPIO基本原理 1.GPIO简介 STM32的GPIO相当于STM32的四肢&#xff0c;一个S…

零拷贝分析

kafka 零拷贝 请求 - 网口 - socket - 用户态 - 内核缓存区 - 内核态&#xff08;磁盘信息&#xff09; 磁盘 - 内核缓存区 - 用户缓存区 - 网络缓存区 零拷贝&#xff08;Zero-Copy&#xff09; 是一种高效的数据传输技术&#xff0c;旨在减少数据在内存中的拷贝次数&#x…

从Instagram到画廊:社交平台如何改变艺术家的展示方式

从Instagram到画廊&#xff1a;社交平台如何改变艺术家的展示方式 在数字时代&#xff0c;艺术家的展示方式正在经历一场革命。社交平台&#xff0c;尤其是Instagram&#xff0c;已经成为艺术家展示作品、与观众互动和建立品牌的重要渠道。本文将探讨社交平台如何改变艺术家的…