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


    一. 练习题目

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

    练习1

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

    #define _CRT_SECURE_NO_WARNINGS 1
    #include
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    在这里插入图片描述

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

    整型提升相关知识

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

    练习2

    代码如下

    int main()
    {
    	char a = -128;
    	printf("%u\n", a);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    题目分析如下

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

    在这里插入图片描述

    扩展题

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

    它的结果会是什么?

    大家可以自己思考一下

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

    练习3

    以下代码的输出结果是?

    int main()
    {
    	int i = -20;
    	unsigned int j = 10;
    	printf("%d\n", i + j);
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

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

    在这里插入图片描述

    所以说 它打印出来的十进制数字是- 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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

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

    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

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

    练习6

    unsigned char i = 0;
    int main()
    {
    	for ( i = 0; i <= 255; i++)
    	{
    		printf("hello world\n");
    	}
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    上面代码的运行结果是?

    我们说
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    请问上面四个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

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

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

    那么大家下期再见咯

  • 相关阅读:
    YOLOv6 PyTorch模型转TensorRT
    零基础学习使用SSRS
    Docker快速入门到项目部署,MySQL部署+Nginx部署
    小程序获取支付api
    Scala的集合操作之可变数组和不可变数组,可变List集合与不可变List集合,可变Set与不可变Set操作,可变和不可变Map集合和元组操作
    最好用的6个图片素材网,高清无水印、免费下载、访问流畅。
    MySQL 从一个表中查出数据并插入到另一个表处理方案(详细)
    2024年无线麦克风十大排名,最好的无线领夹麦克风品牌排行揭榜了!
    易点易动固定资产管理系统: 帮助您应对2023年年终固定资产大盘点
    团建游戏------踩数字
  • 原文地址:https://blog.csdn.net/meihaoshy/article/details/126869404