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

news2024/12/22 20:38:11

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

文章目录

  • 数据在内存中的存储练习题
    • 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

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

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

相关文章

WebSocket快速入门

WebSocket 借鉴&#xff1a; https://blog.csdn.net/weixin_45747080/article/details/117477006 https://cloud.tencent.com/developer/article/1887095 简介 WebSocket 是一种网络传输协议&#xff0c;可在单个 TCP 连接上进行全双工通信&#xff0c;位于 OSI 模型的应用…

第七节HarmonyOS UIAbility生命周期以及启动模式

一、UIAbility生命周期 为了实现多设备形态上的裁剪和多窗口的可扩展性&#xff0c;系统对组件管理和窗口管理进行了解耦。UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态&#xff0c;WindowStageCreate和WindowStageDestroy为窗口管理器&#xff08…

27.0/多态/对象向上转型/向下转型/抽象类/抽象方法。

目录 27.1为什么使用多态? 27.1.2什么是多态 27.1.3对象多态 27.1.4多态的使用前提 27.2 向上转型 27.3向下转型 (面试题) 27.4抽象类和抽象方法 特点(面试题): 27.1为什么使用多态? 需求1&#xff1a;动物园让我们实现一个功能&#xff1a; 创建一个狗类 &#xff0c;狗…

【AICFD案例教程】PCB多变量AI预测分析

AICFD是由天洑软件自主研发的通用智能热流体仿真软件&#xff0c;用于高效解决能源动力、船舶海洋、电子设备和车辆运载等领域复杂的流动和传热问题。软件涵盖了从建模、仿真到结果处理完整仿真分析流程&#xff0c;帮助工业企业建立设计、仿真和优化相结合的一体化流程&#x…

qt实现一个安卓测试小工具

qt实现一个安卓测试小工具 最终效果&#xff1a;目录结构源码gui.py 主要是按钮&#xff0c;文本控制代码main.py 主要是逻辑代码gui.spec 是打包使用的adb.ui 最终效果&#xff1a; 目录结构 上面2个是打包的生成的不用管 源码 gui.py 主要是按钮&#xff0c;文本控制代码…

微信小程序开发——开发账号注册与配置

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 概述 本文的重点在于介绍注册微信小程序开发账号的步骤及其流程。 账号注册 请点击官方网站右上角的 https://mp.weixin.qq.com/ 立即注册&#xff0c;图示如下&#xf…

Python 和 Node.js 之间通信 JSON 数据

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在实际应用中&#xff0c;不同编程语言之间的通信是常见的需求。Python和Node.js是两个流行且功能强大的编程语言&#xff0c;它们之间使用JSON格式进行数据交换是一种高效和灵活的方式。本文将详细介绍如何在Py…

unity3d NPC自动寻路不移动

烘焙的路面不能有间隔&#xff0c;调整地面重新烘焙

基于mvc电影院售票预订选座系统php+vue+elementui

本影院售票系统主要包括二大功能模块&#xff0c;管理员功能模块和用户功能模块。 &#xff08;1&#xff09;管理员模块&#xff1a;系统中的核心用户管理员登录后&#xff0c;通过管理员功能来管理后台系统。主要功能有&#xff1a;首页、个人中心、电影类型管理、场次时间管…

还在担心发抖音没素材跟文案?[腾讯云HAI] AIGC带你蹭热度“今年你失去了什么?”

目录 &#x1f433;前言&#xff1a; &#x1f680;了解高性能应用服务 HAI &#x1f47b;即插即用 轻松上手 &#x1f47b;横向对比 青出于蓝 &#x1f424;应用场景-AI作画 &#x1f424;应用场景-AI对话 &#x1f424;应用场景-算法研发 &#x1f680;使用HAI进行…

人工智能技术发展漫谈

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 人工智能发展历程 人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;的发展历史可以追溯到20世纪中叶。以下是一些关键时刻和阶段&#xff1a; 起…

基于Spring原生框架构建原生Spring的第一个程序!

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

Linux shell编程学习笔记31:alias 和 unalias 操作 命令别名

目录 0 前言1 定义别名2 查看别名 2.1 查看所有别名2.2 查看某个别名 2.2.1 alias 别名2.2.2 alias | grep 别名字符串2.2.3 使用 CtrlAltE 组合键3 unalias&#xff1a;删除别名4 如何执行命令本身而非别名 4.1 方法1&#xff1a;使用 CtrlAltE 组合键 && unalias4…

Appium自动化测试:sdk版本和手机版本不兼容你就这样做,分分钟解决问题

使用pythonappium执行自动化测试脚本提示报错 环境&#xff1a;python3.7以上&#xff0c;appium1.21.0&#xff1b;设备&#xff1a;华为max8真机 报错信息&#xff1a; android.intent.category.LAUNCHER -f 0x10200000 exited with code 4294967295; Stderr: Security ex…

【Python】python天气数据抓取与数据分析(源码+论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

MySQL企业版之Firewall(SQL防火墙)

​​​1. 关于Firewall插件 2. Firewall插件的工作方式 3. Firewall插件测试 4. 总结延伸阅读 1. 关于Firewall插件 Friewall是MySQL企业版非常不错的功能插件之一,启用Firewall功能后,SQL的执行流程见下图示意: 2. Firewall插件的工作方式 Firewall插件的工作机制大概是…

算法基础二

回文数 给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 示例 1&#xff1a; 输入&#xff1…

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

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

智慧化工~工厂设备检修和保全信息化智能化机制流程

化工厂每年需要现场检修很多机器&#xff0c;比如泵、压缩机、管道、塔等等&#xff0c;现场检查人员都是使用照相机&#xff0c;现场拍完很多机器后&#xff0c;回办公室整理乱糟糟的照片&#xff0c;但是经常照了之后无法分辨是哪台设备&#xff0c;而且现场经常漏拍&#xf…

ROC及曲线面积汇总学习

目录 ROC基础 生成模拟数据 率的计算 R语言计算测试 ROCR&#xff1a; pROC ROC绘制 单个ROC 两个ROC Logistic回归的ROC曲线 timeROC ROC基础 ROC曲线的横坐标是假阳性率&#xff0c;纵坐标是真阳性率&#xff0c;需要的结果是这个率表示疾病阳性的率&#xff08;…