数据在内存中的存储练习题

数据在内存中的存储练习题

文章目录

  • 数据在内存中的存储练习题
    • 1. 练习一
    • 2.练习二
    • 3. 练习三
    • 4. 练习四
    • 5. 练习五
    • 6. 练习六
    • 7. 总结

1. 练习一

#include <stdio.h>

int main()
{
	char a = -1;
	signed b = -1;
	unsigned char c = -1;
	printf("a = %d b = %d c = %d", a, b, c);
	return 0;
}

代码运行结果:
a = -1 b = -1 c = 255

解释:
char默认是有符号的
首先 a 和 b 都是有符号的char
-1的原码: 1000 0000 0000 0000 0000 0000 0000 0001
-1的反码: 1111 1111 1111 1111 1111 1111 1111 1110
-1的补码: 1111 1111 1111 1111 1111 1111 1111 1111
由于char只有1个字节,也就是8个bit位,所以会发生截断
char中-1的值为 1111 1111

%d打印的是有符号的整数,会将char类型整型提升至int类型
由于c是无符号的char,整型提升时高位补0
0000 0000 0000 0000 0000 0000 1111 1111
将这个二进制翻译成10进制就是255
所以为255

2.练习二

#include <stdio.h>

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

代码运行结果:
4294967168

解释:
-128的原码: 1000 0000 0000 0000 0000 0000 1000 0000
-128的反码: 1111 1111 1111 1111 1111 1111 0111 1111
-128的补码: 1111 1111 1111 1111 1111 1111 1000 0000
char只有一个字节,会发生截断
-128: 1000 0000

%u打印的是无符号的整数
按照原来的类型进行整型提升
由于char是有符号的char,整型提升时高位补符号位
1111 1111 1111 1111 1111 1111 1000 0000
将这个二进制翻译成十进制就是要打印的数值,这是个相当大的数
可以打开电脑自带的计算器,切换成程序员模式
在这里插入图片描述
打印的数就是4294967168

3. 练习三

#include <stdio.h>

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

代码运行结果:
4294967168

解释:
128的原码:0000 0000 0000 0000 0000 0000 1000 0000
128的反码:0111 1111 1111 11111 1111 11111 0111 11111
128的补码:0111 1111 1111 11111 1111 11111 1000 0000
char只有一个字节,发生截断
128: 1000 0000

char的取值范围只有-128~127,存不下128
char中128的值和-128一样,所以系统会认为我们存的是-128
所以打印的值和练习二一样4294967168

4. 练习四

#include <stdio.h>
#include <string.h>

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

代码运行结果:
255

解释:
循环1000次,一次赋一个值,但是strlen计算的是’\0’之前的元素个数,'\0’的ASCII就是0
所以要在循环中找到第一个0的位置,char类型的取值范围是-128~127
在这里插入图片描述
当char中的值为127时再加一,值就变成了-128
当char中的值为-128时再减一,值就变成了127
如此循环
a[i]的值为 -1 -2 -3 -4 … -127 -128 127 126 125 … 3 2 1 0

所以打印的值为128 + 127 = 255

5. 练习五

代码一:

#include <stdio.h>

unsigned int i = 0;
int main()
{
	for (i = 0; i <= 255; i++)
	{
		printf("Hello World!\n");
	}
	return 0;
}

运行结果:
死循环打印Hello World!
代码二:

#include <stdio.h>
#include <windows.h> //使用Sleep需包含的头文件

int main()
{
	unsigned int i = 0;
	for (i = 9; i >=0 ; i--)
	{
		printf("%u\n",i);
		Sleep(1000); //暂停一秒便于观察
	}
	return 0;
}

代码运行结果:
死循环打印
9 8 7 6 5 4 3 2 1 4294967295 42949672954 …

解释:
代码一中定义了一个无符号的char,取值范围是0~255,永远不会超过255,当超过255时,又会从0开始,所以造成了死循环
代码二中定义了一个无符号的int,和无符号char同理永远不会超过它的取值范围
0~4294967295,当超过最大值时,就会从0继续开始,如果超过最小值0时,又会从最大值开始

6. 练习六

#include <stdio.h>
int main()
{
	int a[4] = { 1,2,3,4 };
	int* p1 = (int*)(&a + 1);
	int* p2 = (int*)((int)a + 1);
	printf("%x,%x", p1[-1], *p2);
	return 0;
}

在VS2022,X86的环境下,代码运行结果:
4,200000

解释:
&a取出的是数组的地址,+1跳过了整个数组,p1指向4后的地址
p1[-1] 等价于*(p1 - 1),p1是int*类型的,-1后退4个字节,整型数组中的元素也是4个字节,所以p1从指向4后的地址变成了指向4,所以p1[-1]是4,打印十六进制也是4
在这里插入图片描述

a表示首元素的地址,将地址转化为int类型的,+1,也就是整数+整数,假设a的地址为0x010,转化为int类型,就是16,+1等于17,转化为十六进制就是0x011,p2的地址从0x010变成了0x011,地址只加了一个字节,也就是跳过了一个字节,p2指向首元素的第二个字节的位置,int解引用访问四个字节,从首元素的第二个字节的位置向后访问四个字节

在这里插入图片描述
访问得到 00 00 00 02,由于小端字节序是低字节存放在低地址,所以是倒着放的,转化为十六进制要反过来02 00 00 00,所以打印的是02000000

7. 总结

在这里插入图片描述

在这里插入图片描述

  1. 有符号的char取值范围是-128~127,当要超过127时,值会-128开始
    1 2 3 … 125 126 127 -128 -127 -126 … -3 -2 -1 0 1 2 3 …
    其他数据类型也一样

  2. char类型的二进制会截断,不管前面是什么,只管最后8个bit的数值
    例如:-1
    -1的原码: 1000 0000 0000 0000 0000 0000 0000 0001
    -1的反码: 1111 1111 1111 1111 1111 1111 1111 1110
    -1的补码: 1111 1111 1111 1111 1111 1111 1111 1111
    截断之后1111 1111
    只会存最后8个bit位,这时候就要看最高位是符号位还是数值位
    有符号值就为-1
    无符号就为255

  3. 有符号的char整型提升时补符号位
    例如:-1
    1111 1111
    -1的补码:1111 1111 1111 1111 1111 1111 1111 1111
    -1的原码:1000 0000 0000 0000 0000 0000 0000 0001
    打印出来就是-1

  4. 无符号的char整型提升时补0
    例如:-1
    1111 1111
    0000 0000 0000 0000 0000 0000 1111 1111
    打印出来就是255

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

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

相关文章

PHP+vue+elementui高校学生社团信息管理系统o7q4a

社团是由高校用户依据兴趣爱好自愿组成&#xff0c;按照章程自主开展活动的用户组织。高校社团是实施素质教育的重要途径和有效方式&#xff0c;在加强校园文化建设、提高用户综合素质、引导用户适应社会、促进用户交流等方面发挥着重要作用&#xff0c;是新形势下有效凝聚用户…

Echarts legend图例配置项 设置位置 显示隐藏

Echarts 官网完整配置项 https://echarts.apache.org/zh/option.html#legend 配置项 legend: { }设置图例为圆形 icon: circle,//设置图例为圆形设置图例位置 top: 20%//距离顶部百分之20//y:bottom 在底部显示设置图例 宽度 高度 itemWidth: 10,//设置图例宽度 itemHeight: …

PCL 计算点云图中任意两点的欧式距离

目录 一、算法原理二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 使用PCL实现在可视化界面上用鼠标点选两个点,输出两点的坐标和两点之间的欧式距离。 二、代码…

HttpRunner原来还能这么用,大开眼界!!!

hook机制 Httprunner 框架中的 hook 机制相当于unittest框架中的 setup , teardown 函数&#xff0c;用来进行测试用例执行之前的环境初始化以及测试用例执行完毕之后的环境清理操作。 httprunner 中的 hooks 机制可以用在测试用例层级也可以用在测试步骤层级&#xff0c;其关键…

OSG编程指南<十三>:OSG渲染状态

1、前言 在 OSG 中存在两棵树&#xff0c;即场景树和渲染树。渲染树是一棵以 StateSet 和 RenderLeaf 为节点的树&#xff0c;它可以做到 StateSet 相同的 RenderLeaf 同时渲染而不用切换 OpenGL状态&#xff0c;并且做到尽量少但在多个不同 State 间切换。渲染树在 CullVisito…

01 项目架构

关于我 曾经就职于蚂蚁金服&#xff0c;多年的后端开发经验&#xff0c;对微服务、架构这块研究颇深&#xff0c;同时也是一名热衷于技术分享、拥抱开源技术的博主。 个人技术公众号&#xff1a;码猿技术专栏个人博客&#xff1a;www.java-family.cn 前期一直在更新《Spring…

sqli-labs关卡21(基于cookie被base64编码的报错盲注)通关思路

文章目录 前言一、回顾上一关知识点二、靶场需要了解的前置知识1、什么是base64编码&#xff1f; 三、靶场第二十一关通关思路1、判断注入点2、爆数据库名3、爆数据库表4、爆数据库列5、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于…

Funbox9_GaoKao通过NC获取反向shell

一. 发现主机 arp-scan -l -I eth0 找打GaoKao主机IP地址 173.30.1.128 二. Nmap扫描主机 nmap -A -T5 172.30.1.128 -A &#xff1a;系统探测&#xff0c;版本检测&#xff0c;脚本扫描&#xff0c;路由跟踪 -T(0-5)&#xff1a;数字越大速度越快(准确度低)&#xff0c;数字越…

vue+echarts实现依赖关系无向网络拓扑结图节点折叠展开策略

目录 引言 一、设计 1. 树状图&#xff08;不方便呈现节点之间的关系&#xff0c;次要考虑&#xff09; 2. 力引导依赖关系图 二、力引导关系图 三、如何实现节点的Open Or Fold 1. 设计逻辑 节点展开细节 节点收缩细节 代码实现 四、结果呈现 五、完整代码 引言 我…

离散数学-集合论基础

3.1集合的基本概念 1&#xff09;集合及元素 2&#xff09;集合的表示 3&#xff09;集合的关系 4&#xff09;特殊集合 3.2集合的运算 并、交、差、对称差 3.3集合的划分与覆盖 3.4排斥包含管理 3.1集合的基本概念 1&#xff09;集合及元素 将某种具有同种属性的个体…

扩散模型实战(十三):ControlNet结构以及训练过程

推荐阅读列表&#xff1a; 扩散模型实战&#xff08;一&#xff09;&#xff1a;基本原理介绍 扩散模型实战&#xff08;二&#xff09;&#xff1a;扩散模型的发展 扩散模型实战&#xff08;三&#xff09;&#xff1a;扩散模型的应用 扩散模型实战&#xff08;四&#xff…

振南技术干货集:znFAT 硬刚日本的 FATFS 历险记(9)

注解目录 1、znFAT 的起源 1.1 源于论坛 &#xff08;那是一个论坛文化兴盛的年代。网友 DIY SDMP3 播放器激起了我的兴趣。&#xff09; 1.2 硬盘 MP3 推了我一把 &#xff08;“坤哥”的硬盘 MP3 播放器&#xff0c;让我深陷 FAT 文件系统不能自拔。&#xff09; 1.3 我…

智能优化算法应用:基于缎蓝园丁鸟算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于缎蓝园丁鸟算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于缎蓝园丁鸟算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.缎蓝园丁鸟算法4.实验参数设定5.算法结果…

WIN10 x86环境部署ARM虚拟机(银河麒麟)

我们经常使用的是x86架构的cpu&#xff0c;而对于不同cpu架构的arm架构的操作系统&#xff0c;我们可以通过QEMU模拟器来进行模拟一个arm环境 1、部署前的准备 arm的镜像&#xff1a; 以此镜像为例&#xff1a;Kylin-Server-10-SP2-aarch64-Release-Build09-20210524.iso QE…

每日一练【移动零】

一、题目描述 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 二、题目解析 可以…

docker限制容器内存的方法

在服务器中使用 docker 时&#xff0c;如果不对 docker 的可调用内存进行限制&#xff0c;当 docker 内的程序出现不可预测的问题时&#xff0c;就很有可能因为内存爆炸导致服务器主机的瘫痪。而对 docker 进行限制后&#xff0c;可以将瘫痪范围控制在 docker 内。 因此&#…

1、nmap常用命令

文章目录 1. 主机存活探测2. 常见端口扫描、服务版本探测、服务器版本识别3. 全端口&#xff08;TCP/UDP&#xff09;扫描4. 最详细的端口扫描5. 三种TCP扫描方式&#xff08;1&#xff09;TCP connect 扫描&#xff08;2&#xff09;TCP SYN扫描&#xff08;3&#xff09;TCP …

两部手机数据传输后备忘录不见了怎么回事

想必很多人都遇到过&#xff0c;当两部手机进行备忘录数据传输后&#xff0c;突然发现备忘录不见了&#xff0c;这让人不禁着急上火&#xff0c;我也曾经遇到过这种事情导致很多重要的内容都丢失了。 一般出现这种情况可能是因为&#xff0c;两部手机使用的是不同的云服务&…

2020年3月25日 Go生态洞察:Go、Go社区与疫情大流行

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

04 # 第一个 TypeScript 程序

初始化项目以及安装依赖 新建 ts_in_action 文件夾 npm init -y安装好 typescript&#xff0c;就可以执行下面命令查看帮助信息 npm i typescript -g tsc -h创建配置文件&#xff0c;执行下面命令就会生成一个 tsconfig.json 文件 tsc --init使用 tsc 编译一个 js 文件 新…