C语言数据的存储超详细讲解中篇练习

目录
  • 前言
  • 数据的存储的知识点练习
    • 练习 1
    • 练习 2
    • 练习 3
    • 练习 4
    • 练习 5
    • 练习 6
    • 练习 7
  • 总结

前言

本文继续学习数据在内存中存储的相关知识点。

  • 数据存储
  • 整型提升

数据的存储的知识点练习

通过几个练习来深入学习数据在内存中存储的知识点,先复习前面学过的整形提升的知识点:C语言操作符超详细讲解下篇

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

负数的整形提升,最高位补充符号位,即1,例如

char a=-1;
11111111 截断后的补码
11111111111111111111111111111111 整形提升后

正数的整形提升,最高位补充符号位,即0,例如:

char a=1;
00000001 截断后的补码
00000000000000000000000000000001 整形提升后

无符号类型的整形提升,最高位直接补充符号位,即0,例如:

unsigned char c = -1;
11111111 截断后的补码
00000000000000000000000011111111  整形提升后

练习 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;
}

乍得一看,以为结果是 -1,-1,-1,下面具体分析:

1、char a = -1;
第一步:-1是整数,在内存的存储形式
    10000000000000000000000000000001  -1原码
    11111111111111111111111111111110  -1反码
    11111111111111111111111111111111  -1补码
第二步:赋值给变量a,截断补码低字节的数据
    11111111
第三步:以%d的形式打印,先要整形提升,
       因为变量a是有符号,且是负数,所以高位补1
    11111111111111111111111111111111  补码
    11111111111111111111111111111110  反码
    10000000000000000000000000000001  原码
第四步:最终打印是的原码,数值是十进制 -1
    
    2、signed char b = -1;
    过程同有符号变量a的分析过程
    
    3、unsigned char c = -1;
第一步:-1在内存的存储形式
    10000000000000000000000000000001  -1原码
    11111111111111111111111111111110  -1反码
    11111111111111111111111111111111  -1补码
第二步:赋值给变量c,截断补码低字节的数据
    11111111
第三步:以%d的形式打印,先要整形提升,
    因为变量c是无符号的,最高位1为数据位,
    不是符号位,所以高位直接补0
    00000000000000000000000011111111  补码
第四步:因为正数三码相同
    最终打印的是原码,数值是十进制255

结果见下图:

练习 2

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

乍得一看,以为结果是 -128,下面具体分析:

char类型 有符号类型数据范围 -128-127
    char a = -128;
第一步:-128在内存的存储形式
    10000000000000000000000010000000 原码
    11111111111111111111111101111111 反码
    11111111111111111111111110000000 补码
第二步:赋值给char 变量a,发生截断,取低字节数据
    10000000 - a
第三步:打印%u,首先进行整形提升
    因为变量a是有符号,且是负数,所以高位补充符号位,即补1
    11111111111111111111111110000000 补码 负数
第四步:%u,认为是无符号数据,即正数。最高位1为数据位
    11111111111111111111111110000000 补码 正数
第五步:因为正数三码相同
    最终打印的是原码,数值是十进制4,294,967,168

结果见下图:

练习 3

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

乍得一看,以为结果是 128,下面具体分析:

第一步:整形128在内存的存储形式
    00000000000000000000000010000000 原码=反码=补码
第二步:赋值给char类型 a,发生截断,取低字节数据
    10000000 - a
第三步:按照%u打印,先对a进行整型提升,
    因为变量a是有符号,且是负数,所以高位补充符号位,即补1
    11111111111111111111111110000000 补码 负数
第四步:%u,认为是无符号数据,即正数。最高位1为数据位
    11111111111111111111111110000000 补码 正数
第五步:因为正数三码相同
    最终打印的是原码,数值是十进制4,294,967,168

结果见下图:

练习 4

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

乍得一看,以为结果是 -10,下面具体分析:

第一步:整形 -20 在内存的存储形式
    10000000000000000000000000010100 原码
    11111111111111111111111111101011 反码
    11111111111111111111111111101100 补码
第二步:整形 10 在内存的存储形式
    00000000000000000000000000001010 原码
    00000000000000000000000000001010 反码
    00000000000000000000000000001010 补码
第三步:i + j    补码相加
    11111111111111111111111111101100 -20的补码
    00000000000000000000000000001010 10的补码
    11111111111111111111111111110110 相加后的补码
第四步:最终打印的是原码,数值是十进制 -10
    11111111111111111111111111110101 反码
    10000000000000000000000000001010 原码

结果见下图:

练习 5

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

乍得一看,以为结果是9 到0,共10个数,下面具体分析:

1、i从9到0时,
    是正常的输出9到0
  2、i=-1时
第一步:-1是整数,在内存的存储形式
    10000000000000000000000000000001  -1原码
    11111111111111111111111111111110  -1反码
    11111111111111111111111111111111  -1补码
第二步:-1赋值给无符号类型时,认为最高1为数据位
    11111111111111111111111111111111  变成的正数的补码了
    数值大于0,又进入循环了,所以是死循环

结果见下图:

练习 6

int main()
{
	char a[1000];
	int i;
	for (i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d\n", strlen(a));//字符串长度,字符'\0'之前的字符个数
	printf("%d\n", sizeof(a));//字符串中字符的个数
	return 0;

}

乍得一看,以为结果是1000、1000,下面具体分析:

char类型 有符号类型数据范围 -128-127
  1、i从0到127时,
    是正常的输出-1 -2 -3 ....-128
  2、i=128时
  a[128]=-129
第一步:-129是整数,在内存的存储形式
    10000000000000000000000010000001 原码
    11111111111111111111111101111110 反码
    11111111111111111111111101111111 补码
第二步:-129 赋值给char类型a[128]时,发生截断,取低字节数据
    01111111 - a[128]=127

strlen求得字符串长度,是字符 ‘\0’ 之前的字符个数,而第256个元素a[256]=0时,ASCII码值就是0,也就是字符 ‘\0’ 的ASCII码值,于是认为字符串到此结束了,strlen(a)=255。

所以数组的元素规律是:

  • 从-1到-128
  • 然后输出127到0
  • 又从-1到-128
  • 然后输出127到0
  • 这是一个循环,是一个圆

sizeof(a)求取字符串中字符的个数,sizeof(a)=1000:

数组中一共有1000个字符,第256个元素为0,ASCII码与字符’\0’, 一样,即字符串到此结束,strlen(a)=255。 ,从256到999都是有元素存在的,sizeof(a)=1000。下面是输出结果。

练习 7

unsigned char i = 0;//无符号类型的数据范围是:0-255
int main()
{
	for ( i = 0; i <=255; i++)
	{
		printf("hello world\n");
	}
	return 0;
}

乍得一看,以为结果是打印256行 hello world,下面具体分析:

1、i从0到255时
    正常打印 hello world
2、当i=256时
第一步:i=256,在内存中的存储形式
    00000000000000000000000100000000 补码
    赋值给无符号char i,发生截断,取低字节数据
    00000000 - i 此时i又满足循环条件了,又陷入死循环了
1、i从0到255时
    正常打印 hello world
2、当i=256时
第一步:i=256,在内存中的存储形式
    00000000000000000000000100000000 补码
    赋值给无符号char i,发生截断,取低字节数据
    00000000 - i 此时i又满足循环条件了,又陷入死循环了

结果见下图所示:

总结

通过7个练习来巩固数据存储的知识点,尤其是整型提升的内容,要注意掌握。

下一篇更新浮点型在内存中的存储的相关知识点。

到此这篇关于C语言数据的存储超详细讲解中篇练习的文章就介绍到这了,更多相关C语言 数据的存储内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言数据存储详解

    目录 一.数据类型 二.整型在内存中的存储 1.原码.反码.补码 大小端介绍 三.浮点型在内存中的存储 1.举一个浮点数存储的例子: 2.浮点数存储规则: 总结 一.数据类型 char:字符数字类型.有无符号取决于编译器,大部分编译器有符号(signed char) 而short.int.long都是有符号的. unsigned char c1=255;内存中存放二进制的补码:11111111 都是有效位,没有符号位 char c2=255;结果为-1 同理可推出short.int等 二.整型在

  • 详解C语言中数据的存储

    目录 一.类型归类 1.整形家族 2.浮点型家族 3.指针类型 4.空类型 二.类型的意义 三.数据在类型中存储(以整形和浮点型为例子) 1. 关于 存储的基本概念 2.存储模式 四.应用 1. 2. 对于char范围的讨论 总结 一.类型归类 对于基本的c语言数据类型的基本归类 1.整形家族 char (内存存储的为ascall码值,存储为整数) unsigned char// unsigned为无符号关键字 signe char// short unsigned short (int)//

  • C语言中数据的存储详解

    目录 1.内置类型 (1)整型数组 (2)浮点型 2.自定义类型 3.指针类型 字符型 浮点型 (一) (二) 总结 数据的存储首先就要说到数据的类型,类型决定了看待内存空间的视角. C语言的数据类型分为内置类型和外置类型 1.内置类型 (1)整型数组 char(字符型).short(短整型).int(整型).long(长整型)(signed 或者 unsigned) (2)浮点型 float(单精度浮点型).double(双精度浮点型) 2.自定义类型 (1)数组类型 此处需要注意的是,去掉数

  • C语言编程数据在内存中的存储详解

    目录 变量在计算机中有三种表示方式,原码反码,补码 原码 反码 补码 总结一下 浮点数在内存的储存 C语言中,有几种基本内置类型. int unsigned int signed int char unsigned char signed char long unsigned long signed long float double 在内存中创建变量,会在内存中开辟空间,并为其赋值. int a=10; 在计算机中,所有数据都是以二进制的形式存储在内存中. 变量在计算机中有三种表示方式,原码反

  • C语言数据的存储详解

    目录 数据类型的介绍 整形 浮点型 构造类型 指针类型 void空类型 整数在内存中的存储 原反补的介绍 大小端的介绍 面试例题 练习 浮点数在内存中的存储 存储规则讲解 举例 IEEE754的特别规定 案例 float用%d打印的特例讲解 数据类型的介绍 数据类型存在的意义 为变量开辟的空间大小(大小决定了使用范围) 取数据的时候按照什么格式取出(先看大小端,在看数据类型(用来解析二进制数据的方式)) 整形 char unsigned char signed char short unsign

  • C语言数据的存储超详细讲解上篇

    目录 前言 1.数据类型介绍 类型的基本归类 2.整形在内存中的存储 2.1 原码.反码.补码 2.2 大小端介绍 2.2.1 什么是大小端 2.2.2 大端和小端意义 2.2.3 写程序判断字节序 总结 前言 本文开始学习C语言进阶的内容了,进阶内容,是在基础阶段的内容上进行拓展,有的知识点,在基础阶段也已经学过.在进阶内容中,将从更深层次的角度去理解学习,本文主要内容包括: 数据类型详细介绍 整形在内存中的存储:原码.反码.补码 大小端字节序介绍及判断 浮点型在内存中的存储解析 1.数据类型

  • C语言中数据在内存如何存储

    目录 数据类型 类型的基本归类 整形 浮点型 构造类型(自定义类型) 指针类型 空类型 整形在内存中的存储 大小端字节序 储存时数据发生截断以及整型提升 浮点型在内存中的存储 浮点型和整形在内存中的储存方式不同 拿出这些储存的数据(三种情乱) 情况一:E不全为0或不为全1 情况二:E全为0 情况三:E为全1 数据类型 常见的数据类型 常见的数据类型 字节 char 字符数据类型 1 short 短整型 2 int 整形 4 long 长整型 4 long long 更长的整形 8 float 浮

  • C语言数据在内存中的存储详解

    目录 文章摘要 一.C语言的数据类型 数据类型基本分为: 二.隐式类型转换 1.什么是隐式类型转换 2.整型提升 3.类型转换 三.机器大小端 1.什么是大小端 2.大小端在截断的应用 3.判断当前机器的字节序是大端还是小端 四.整型在内存中的存储 1.原码.反码.补码 2.举例实践整型数据在内存的存储 总结 文章摘要 本文通过内存底层原理,帮你透彻了解数据存储进内存与从内存中读取的区别以及不同数据类型下数据计算.赋值的变化情况 要透彻理解这些,必须知道隐式类型转换以及机器大小端的概念,本文会对

  • C语言数据的存储超详细讲解中篇练习

    目录 前言 数据的存储的知识点练习 练习 1 练习 2 练习 3 练习 4 练习 5 练习 6 练习 7 总结 前言 本文继续学习数据在内存中存储的相关知识点. 数据存储 整型提升 数据的存储的知识点练习 通过几个练习来深入学习数据在内存中存储的知识点,先复习前面学过的整形提升的知识点:C语言操作符超详细讲解下篇 整形提升是按照变量的数据类型的符号来提升的 负数的整形提升,最高位补充符号位,即1,例如 char a=-1;11111111 截断后的补码1111111111111111111111

  • C语言数据的存储超详细讲解下篇浮点型在内存中的存取

    目录 前言 浮点型在内存中的存储 浮点数存储的例子 浮点数存储规则 IEEE 754规定 IEEE 754对有效数字M的特别规定 IEEE 754对指数E的特别规定 存入内存是E的规定 从内存取出时E的规定 举例 1 举例 2 举例 3 判断两个浮点数是否相等? 总结 前言 本文接着学习数据的存储相关的内容,主要学习浮点型数在内存中的存储与取出. 浮点型在内存中的存储 常见的浮点数:3.14159.1E10 浮点数家族包括: float.double.long double 类型 浮点数表示的范

  • C语言数组超详细讲解中篇三子棋

    目录 前言 1.三子棋是什么? 1.1 百度百科 1.2 游戏编程准备工作 2. 程序实现 2.1 搭建程序框架 2.2 模块化编程 2.2.1 源文件test.c 2.2.2 源文件play.c 2.2.3 头文件play.h 2.3 程序实现—拓展play函数 2.3.1 棋盘初始化与打印函数 2.3.2 玩家下棋函数 PlayMover 2.3.3 电脑下棋函数 ComputerMove 2.2.4 判断赢家函数 WhoIsWin 总结 前言 本文主要是对前面所学内容进行复习和练习,学习内

  • C语言 struct结构体超详细讲解

    目录 一.本章重点 二.创建结构体 三.typedef与结构体的渊源 四.匿名结构体 五.结构体大小 六.结构体指针 七.其他 一.本章重点 创建结构体 typedef与结构体的渊源 匿名结构体 结构体大小 结构体指针 其他 二.创建结构体 先来个简单的结构体创建 这就是一个比较标准的结构体 struct people { int age; int id; char address[10]; char sex[5]; };//不要少了分号. 需要注意的是不要少了分号. 那么这样创建结构体呢? s

  • C语言超详细讲解数据结构中双向带头循环链表

    目录 一.概念 二.必备工作 2.1.创建双向链表结构 2.2.初始化链表 2.3.动态申请节点 2.4.打印链表 2.5.销毁链表 三.主要功能 3.1.在pos节点前插入数据 尾插 头插 3.2.删除pos处节点数据 尾删 头删 3.3.查找数据 四.总代码 List.h 文件 List.c 文件 Test.c 文件 五.拓展 一.概念 前文我们已经学习了单向链表,并通过oj题目深入了解了带头节点的链表以及带环链表,来画张图总体回顾下: 在我们学习的链表中,其实总共有8种,都是单双向和带不带

  • C语言超详细讲解数据结构中的线性表

    目录 前言 一.分文件编写 1.分文件编写概念 2.代码展示 二.动态分布内存malloc 1.初识malloc 2.使用方法 三.创建链表并进行增删操作 1.初始化链表 2.在链表中增加数据 3.删除链表中指定位置数据 四.代码展示与运行效果 1.代码展示 2.运行效果 总结 前言 计算机专业都逃不了数据结构这门课,而这门课无疑比较难理解,所以结合我所学知识,我准备对顺序表做一个详细的解答,为了避免代码过长,采用分文件编写的形式,不仅可以让代码干净利落还能提高代码可读性,先解释部分代码的含义,

  • C语言数据的存储和取出详细讲解

    数据的存储和取出 整形的储存 我们知道一个整形的存储是以补码的形式储存取出是原码的形式. 比如:int a = 5;的二进制是101 那它的原码应该是:00000000 00000000 00000000 00000101 正数的原反补相同那它存进去和取出来都是:00000000 00000000 00000000 00000101 那float a = 5.5;也是四个字节它和整形存储的方式一样吗? 浮点型的储存方式 例子: #define _CRT_SECURE_NO_WARNINGS 1

  • C语言数据结构超详细讲解单向链表

    目录 1.链表概况 1.1 链表的概念及结构 1.2 链表的分类 2. 单向链表的实现 2.1 SList.h(头文件的汇总,函数的声明) 2.2 SList.c(函数的具体实现逻辑) 2.2.1 打印链表 2.2.2 搞出一个新节点(为其他函数服务) 2.2.3 链表尾插 2.2.4 链表头插 2.2.5 链表尾删 2.2.6 链表头删 2.2.7 查找节点 2.2.8 在pos位置之前插入 2.2.9 在pos位置之后插入 2.2.10 删除pos位置 2.2.11 删除pos之后位置 2.

  • C语言 超详细讲解算法的时间复杂度和空间复杂度

    目录 1.前言 1.1 什么是数据结构? 1.2 什么是算法? 2.算法效率 2.1 如何衡量一个算法的好坏 2.2 算法的复杂度 2.3 复杂度在校招中的考察 3.时间复杂度 3.1 时间复杂度的概念 3.2 大O的渐进表示法 3.3 常见时间复杂度计算举例 4.空间复杂度 5. 常见复杂度对比 1.前言 1.1 什么是数据结构? 数据结构(Data Structure)是计算机存储.组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合. 1.2 什么是算法? 算法(Algorit

随机推荐