当前位置: 首页 > news >正文

c语言进阶 数组在内存中的存储(下)

c语言进阶 数组在内存中的存储(下)

  • 一. 练习题目
    • 练习1
    • 练习2
    • 练习3
    • 练习4
    • 练习5
    • 练习6
  • 二. 浮点数在内存中的存储
    • 浮点数的储存规则
    • 补充

一. 练习题目

我们先从几道题目开始 复习下上一篇博客的内容

练习1

下面这段代码的输出结果是什么?

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
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;
}

首先来分析下题目 根据我们在前面学到的知识 signed char 和 char其实是同一种类型
所以说 a 和 b的输出结果都是一样的 都是-1
我们都知道 在计算机中存储一个数字的补码
我们画图来表示下c的存储过程

在这里插入图片描述

关于整型提升的相关知识大家可以参考我的这篇博客

整型提升相关知识

所以说 输出的三个数字分别是 -1 -1 255

练习2

代码如下

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

题目分析如下

在这里插入图片描述
我们得到的最终结果是

在这里插入图片描述

扩展题

如果我们打印char a 是 128呢?

它的结果会是什么?

大家可以自己思考一下

(注意char类型的取值范围)

练习3

以下代码的输出结果是?

int main()
{
	int i = -20;
	unsigned int j = 10;
	printf("%d\n", i + j);
	return 0;
}

还是一样 我用画图的方式来给大家解决这个问题

在这里插入图片描述

所以说 它打印出来的十进制数字是- 10

通过上面几道题目的计算 相信大家对于有符号数 无符号数的理解应该会加深一层

练习4

代码表示如下


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

要想知道这个题目的答案我们首先要知道两个知识点

1 字符串结束的表示是‘\0’,它的ascll码值就是0
2 char类型作为一个无符号数的时候有范围 它的范围是-128~127

如下图

在这里插入图片描述

由上面这些知识我们可以知道

数组i里面存储的值会是这样子的规律

-1 - 2 … …-128 127 126 … 3 2 1 0

其中-1到0一共经历了 127 +128 一共255个字符

所以说字符串长度为255

在这里插入图片描述

练习5

请问下面代码运行的结果是?

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

这里我们要注意的是
unsigned int i 是一个无符号数
所以说它的值恒大于等于0

因此 我们可以说这个代码一定会进入死循环

练习6

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

上面代码的运行结果是?

我们说
unsigned char i 是一个无符号数 占用一个字节的大小
所以说它的表示范围是 0000 0000(0) 到 1111 1111 (255)
因此 它小于等于255恒成立

所以说 代码会进入死循环

二. 浮点数在内存中的存储

老规矩 我们先来看一段代码

int main()
{
	int n = 9;
	float* p = &n;
	printf("%d\n", n);
	printf("%f\n", *p);

	*p = 9.0;
	printf("%d\n", n);
	printf("%f\n", *p);
	return 0;
}

请问上面四个printf程序从上到下依次输入的值是?

让我们带着这个问题 来进入下面的浮点数规则学习

浮点数的储存规则

根据国际标准IEEE 任意一个二进制浮点数V可以表示成下面的形式

  1. (-1)^ S * M * 2^E
  2. 其中(-1)^ S表示符号位 当s=0时 表示为一个正数 当s=1时表示为一个负数
  3. M表示有效位数字 大于等于1 小于2
  4. 2^E表示指数位

我们举例来说
十进制的5.5 写成二进制就是101.1 相当于1.011x2^2

那么 按照相面形式 我们可以得到

S = 0
M = 1.011
E = 2

我们规定

在32位的系统中

最高位1位是符号位S
接着8位是指数E
剩下23位是有效数字M

在64位的系统中
最高位1位是符号位S
接下来11位是指数E
剩下23位是有效位数字M

我们规定 在存浮点数的时候省略M最前面的数字1
对于8位数的E 我们在储存中加上一个127
对于11位数的E 我们在储存中加上一个1023

还是以5.5为例 它的浮点数存储形式为

0 (S) 1000 0001(E) 01110 00000 00000 00000 000 (M)

补充

当指数E从内存中取出的时候
E不全为0或者不全为1

这时候指数E的计算值减去127(或1023)得到真实值

E全为0时

我们可以将它看作为0

E全为1时

我们将它看作无限

好了 这时候我们运用我们目前所学到的知识来解决上面的题目

9的整数储存应该是
0000 0000 0000 0000 0000 0000 0000 1001

9的浮点数储存应该是
0 1000 0010 001 0000 0000 0000 0000 0000

所以说上面两个输出的值应该为 9 和0.000000

下面两个输出的值应该为 一个很大的正数 和9.000000

以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够

不吝赐教 在评论区或者私信指正 博主一定及时修正

那么大家下期再见咯

相关文章:

  • c语言初阶测评
  • Loss上升,精度却也上升?
  • 【Linux---06】远程登陆 「ssh登陆 | Xshell登陆 | 上传下载文件」
  • 基于阶梯式Tent混沌和模拟退火的樽海鞘群算法
  • 【Linux 基础笔记】(二)
  • 关于gdb调试: 你的问题可能会在这里找到答案
  • J9数字论:什么是Web3.0概念?
  • MediaCodec_Analyze-1-create
  • vue3中<script setup> 和 setup函数的区别
  • c语言进阶 数据的存储(上)
  • A8.2022年全国数学建模竞赛 B题-赛题分析与讨论
  • Vue指令总结
  • 离开二线城市石家庄(勉强算二线吧)去北漂,入职外包测试岗一个月想辞职了~
  • 瑞康医药与亚马逊云科技达成战略合作,全国上百家子公司业务上云
  • 内存取证工具Volatility学习
  • JavaScript-如何实现克隆(clone)函数
  • 07.Android之多媒体问题
  • android高仿小视频、应用锁、3种存储库、QQ小红点动画、仿支付宝图表等源码...
  • gitlab-ci配置详解(一)
  • java 多线程基础, 我觉得还是有必要看看的
  • mysql外键的使用
  • nodejs:开发并发布一个nodejs包
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 成为一名优秀的Developer的书单
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 浮现式设计
  • 关于for循环的简单归纳
  • 基于遗传算法的优化问题求解
  • 聊聊directory traversal attack
  • 前端路由实现-history
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 设计模式(12)迭代器模式(讲解+应用)
  • 跳前端坑前,先看看这个!!
  • 网页视频流m3u8/ts视频下载
  • 新版博客前端前瞻
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • HanLP分词命名实体提取详解
  • 回归生活:清理微信公众号
  • !$boo在php中什么意思,php前戏
  • "无招胜有招"nbsp;史上最全的互…
  • #QT(智能家居界面-界面切换)
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (4)(4.6) Triducer
  • (NSDate) 时间 (time )比较
  • (SpringBoot)第二章:Spring创建和使用
  • (待修改)PyG安装步骤
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (简单) HDU 2612 Find a way,BFS。
  • (五)IO流之ByteArrayInput/OutputStream
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (一)基于IDEA的JAVA基础10
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)关于pipe()的详细解析
  • .axf 转化 .bin文件 的方法
  • .net6 webapi log4net完整配置使用流程