广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C语言深入探索数据类型的存储
  • 462
分享到

C语言深入探索数据类型的存储

2024-04-02 19:04:59 462人浏览 泡泡鱼
摘要

目录数据类型介绍类型的基本归纳整型家族浮点数家族构造类型指针类型空类型整型在内存中的存储原码,反码,补码大小端浮点数在内存中的存储浮点数存储的规则数据类型介绍 首先,对于我们C语言中

数据类型介绍

首先,对于我们C语言中的数据类型,大家应该都有一个清晰的认识吧!如果不记得也没有关系哦~ 在这里来跟着小刘同学回顾一下吧!

关于数据类型,我们在前面已经学习过了一些内置数据类型,以及它们所占的内存空间的大小,例如:

char         //字符数据类型
int          //整型
short        //短整型
long         //长整型
long long    //更长的整型
float        //单精度浮点型
double       //双精度浮点型

那,在这里,我们需要思考一个问题:在C语言中存在字符串类型嘛?

这个问题的答案需要大家自己去思考哟~(当然,如果不知道的话可以私信小刘同学哟~

类型的意义:1.使用这个类型开辟的内存空间的大小,也就是说类型决定了我们可以使用的空间的大小。2.如何看待内存空间的视角。

类型的基本归纳

首先,当然是我们经常使用的整型类型家族啦!

整型家族

char //字符数据类型
    unsigned char //无符号字符型
    signed char //有符号字符型
short //短整型
     unsigned short[int] //无符号短整型
     signed short[int] //有符号短整型
int //整型
   unsigned int //无符号整型
   signed int //有符号整型
long //长整型
    unsigned long[int] //无符号长整型
    signed long[int] //有符号长整型

当然,整型家族当然是少不了我们的long long int 型的,但是由于更长长整型的分类与整型家族其他成员的分类是相似的,所以在这里我们不加赘述。

浮点数家族

float
double

构造类型

>数组类型
>结构体类型 struct
>枚举类型 enum
>联合类型 uNIOn

指针类型

int * pi;
char * pc;
float * pf;
void * pv; 

空类型

void表示空类型(无类型)

空类型通常应用于函数的返回类型,函数的参数,指针类型。

整型在内存中的存储

首先,我们在之前的文章中谈到过,变量的创建是要在内存中开辟一部分空间的。而开辟的空间的大小是要根据不同的类型而决定的。那么,下面就跟着小刘同学一起来学习一下数据在它所开辟的内存中究竟是如何进行存储的吧!

我们先来举一个例子吧:

int a=10;
int b=-10;

我们知道,因为a为int型,所以为a分配了4个字节的空间,那么,在内存又该如何存储呐?

要想了解这一点,我们先来明白几个概念:

原码,反码,补码

在计算机中的整数存在3种2进制的表示方式:原码、反码、补码。

这三种方法均存在符号位和数值位这两个部分。符号位使用0表示'正',使用1表示'负'。而数值位正数的原码、反码、补码都相同。而负整数的三种表示方法都不相同。

原码

直接将数值按照正负数的形式转换成二进制的形式就可以得到原码。

反码

将原码的符号位不变,其他位依次求反就可以得到反码。

补码

在反码的基础上+1就可以得到补码。

对于整形来说,数据存放在内存中其实是以补码的形式存放的。(相信学过数电的小伙伴一定知道这是为什么。那么其他不知道所以然的小伙伴请自行百度询问哦。

在vs里面我们可以看到a和b在内存中的地址,但是,这样看是不是有点不太对?

按照我们上面所讲的内容,列出a和b在内存中存储的二进制形式再根据二进制转为十六进制的规则,a和b在内存中的存储应该是下图所示的形式,那么为什么我们在VS的调试中会出现不一样的结果呐?

int a=10;
//原码:0000 0000 0000 0000 0000 0000 0000 1010
//反码:0000 0000 0000 0000 0000 0000 0000 1010
//补码:0000 0000 0000 0000 0000 0000 0000 1010
// 00 00 00 0a
int b=-10;
//原码:1000 0000 0000 0000 0000 0000 0000 1010
//反码:1111 1111 1111 1111 1111 1111 1111 0101
//补码:1111 1111 1111 1111 1111 1111 1111 1010 
//ff ff ff fa

这个时候,我们来再了解一个概念——大小端。

大小端

大小端指的是两种不同的存储方式。那么下面我们来详细了解一下什么是大小端:

大端(存储)模式:是指数据的低位数保存在内存的高地址中,而数据的高位,保存在内存的低地址中。

小端(存储)模式:是指数据的低位数保存在内存的低地址中,而数据的高位,保存在内存的高地址中。

当然,大端存储和小端存储是根据编译器的不同来决定的。

这样子只看概念大家是否感到十分疑惑呐?下面,小刘同学给大家画图模拟一下大端存储和小端存储的基本情况吧!

这样子,大家是不是对大端存储和小端存储有了一个基本的概念了解呐?

那么,大家现在是不是非常好奇自己目前使用的编译器究竟使用了那种存储方式呐?

下面请跟着小刘同学来判断一下自己所使用的编译器究竟是哪种存储方式吧!

我们首先定义一个变量:int a=1;

int a=1;
//原码:0000 0000 0000 0000 0000 0000 0000 0001
//反码:0000 0000 0000 0000 0000 0000 0000 0001
//补码:0000 0000 0000 0000 0000 0000 0000 0001
//如果是大端存储,返回的第一个字节一定为00 ——> 0
//如果是小端存储,返回的第一个字节一定为01 ——> 1

完整代码如下:

#include<stdio.h>
int chek_sys()
{
	int i = 1;
	return (*(char*)&i);
}
int main()
{
	int ret = chek_sys();
	if (ret == 1)
	{
		printf("小端\n");
	}
	else 
	{
		printf("大端\n");
	}
	return 0;
}

浮点数在内存中的存储

浮点数存储的规则

首先,我们来举一个例子

#include<stdio.h>
int main()
{
	int n = 9;
	float* pFloat = (float*)&n;
	printf("n的值为:%d\n", n);
	printf("*pFloat的值为:%f\n", *pFloat);
	*pFloat = 9.0;
	printf("num的值为:%d\n", n);
	printf("*pFloat的值为:%f\n", *pFloat);
	return 0;
}

以上代码执行的结果为:

它这个结果好像和我们想象的结果不太一样哎。这是为什么呐?在这里就不得不提一下浮点数在内存中的存储规则了。

根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:

  • (-1)^S * M * 2E
  • (-1)S表示符号位,当S=0,V为正数;当S=1,V为负数。
  • M表示有效数字,大于等于1,小于2。
  • 2^E表示指数位。

看到这里,大家是不是有很多的疑问和不理解?别急,下面小刘同学来为大家讲解清楚。

要想理解上面的内容,我们先来举一个例子吧!

例如:9.5f

小数点后面的权重是2的-1次方,-2次方这样子依次类推。

当然,并不是所有的浮点数都可以表示出来的,有的浮点数是无法表示出来的,小数点后面的数无法精确表示,可能会出现精度缺失。

IEEE 754对有效数字M和指数E,还有一些特别规定。

前面说过, 1≤M<2 ,也就是说,M可以写成 1.xxxxxx 的形式,其中xxxxxx表示小数部分。 IEEE 754规定,在计算机内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。

至于指数E,情况就比较复杂。

首先,E为一个无符号整数(unsigned int) 这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间 数是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即 10001001。

在我们已经知道如何存储浮点数后,我们再来学习一下如何将浮点数从内存中取出。

指数E从内存中取出还可以再分成三种情况:

E不全为0或不全为1

这时,浮点数就采用下面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。 比如: 0.5(1/2)的二进制形式为0.1,由于规定正数部分必须为1,即将小数点右移1位,则为 1.0*2^(-1),其阶码为-1+127=126,表示为01111110,而尾数1.0去掉整数部分为0,补齐0到23位00000000000000000000000,则其二进制表示形式为:

//0 01111110 00000000000000000000000

E全为0

这时,浮点数的指数E等于1-127(或者1-1023)即为真实值, 有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。

E全为1

这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s)。

以上及是数据存储的内容。另外,关于数据存储方面的一些补充和讲解

到此这篇关于C语言深入探索数据类型的存储 的文章就介绍到这了,更多相关C语言数据存储 内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C语言深入探索数据类型的存储

本文链接: https://www.lsjlt.com/news/165152.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C语言深入探索数据类型的存储
    目录数据类型介绍类型的基本归纳整型家族浮点数家族构造类型指针类型空类型整型在内存中的存储原码,反码,补码大小端浮点数在内存中的存储浮点数存储的规则数据类型介绍 首先,对于我们C语言中...
    99+
    2022-11-13
  • C语言深入探究sizeof与整型数据存储及数据类型取值范围
    目录1.关键字sizeof2.整型数据存储深入3.数据类型取值范围深入1.关键字sizeof sizeof 与 strlen 是我们日常打代码时经常使用到的两个“工具&r...
    99+
    2022-11-13
  • C语言数据结构深入探索顺序表
    目录1.线性表2.顺序表2.1概念及结构2.2 接口实现2.2.1初始化2.2.2 检查容量2.2.3 顺序表打印2.2.4 顺序表尾插2.2.5 顺序表尾删2.2.6 顺序表头插2...
    99+
    2022-11-13
  • C语言深入探索递归的特点
    目录递归的认识main函数可以递归吗递归核心思想讲解递归的缺点递归的认识 基本认识: 1.首先递归的本质还是函数调用,也要形成和释放栈帧。 2.函数的调用是有成本的,这个成本在时间和...
    99+
    2022-11-13
  • C语言深入探索动态内存分配的使用
    目录一、动态内存分配的意义二、malloc 和 free三、关于 malloc(0)四、calloc 和 realloc五、小结一、动态内存分配的意义 C语言中的一切操作都是基于内存...
    99+
    2022-11-13
  • C语言深入探索浮点数的使用秘密
    目录一、内存中的浮点数二、浮点数存储实例三、浮点类型的秘密四、小结一、内存中的浮点数 浮点数在内存的存储方式为:符号位,指数,尾数 类型符号位指数尾数float1位(第31位)8位(...
    99+
    2022-11-13
  • 深入探索Go语言内存优化的艺术
    Go语言是一种非常强大且灵活的编程语言,但是在内存管理方面也存在一些挑战。本文将深入探索Go语言内存优化的艺术,帮助开发者更好地理解...
    99+
    2023-10-08
    Golang
  • C语言深入探究函数的溯源
    目录一、函数的由来二、模块化程序设计三、C 语言中的模块化四、面向过程的程序设计五、声名和定义六、小结一、函数的由来 二、模块化程序设计 三、C 语言中的模块化 四、面向过程的...
    99+
    2022-11-13
  • R语言数据类型深入详解
    R语言用来存储数据的对象包括: 向量, 因子, 数组, 矩阵, 数据框, 时间序列(ts)以及列表 意义介绍 1. 向量(一维数据): 只能存放同一类型的数据 语法: c(dat...
    99+
    2022-11-11
  • C语言数据在内存中的存储流程深入分析
    目录前言类型的基本分类整型浮点数自定义类型整型在内存中的存储原码、反码、补码大端和小端如何判断编译器是大端还是小端浮点数在内存中的存储总结前言 C语言中有char、short、int...
    99+
    2022-11-13
    C语言数据在内存中的存储 C语言数据存储
  • C语言深入了解自定义数据类型的使用
    目录一、自定义数据类型(上)二、自定义数据类型(中)​​​​​三、自定义数据类型(下)​​​​​一、自定义数据类型(上) 类型命名关键字 (typedef) C语言中可以对类型赋予新...
    99+
    2022-11-13
  • 深度解析C语言中数据的存储
    目录前言数据类型介绍类型的基本归类整型家族浮点数家族构造类型指针类型空类型前言 在VS编译器里有release和debug两种形式,debug包含调试信息,release不包含调试信...
    99+
    2022-11-13
  • 深入分析C语言存储类型与用户空间内部分布
    目录1、定义变量的格式2、6个存储类型3、auto存储类型-自动存储类型4、register存储类型-寄存器存储类型5、const存储类型-常量存储类型6、static-静态存储类型...
    99+
    2022-12-26
    C语言存储类型 C语言用户空间内部分布
  • C语言深入探索之单链表与typedef的用法
    目录前言详解typedef关键字含义具体使用详解单链表参数形式指针知识补充单链表形参详解单链表实战案例完整代码实现详解头插建表运行效果前言 昨天博主去本站问答贴子逛了逛,然后发现了好...
    99+
    2022-11-13
  • C语言入门篇--初识C语言及数据类型
    目录1.什么是C语言?2.第一个C程序&&知识点2.1头文件2.2main函数2.3函数调用2.4return0;3.数据类型3.1C语言数据类型3.2为什么有这么多...
    99+
    2022-11-12
  • C语言数据存储归类介绍
    目录数据类型的介绍类型的基本归类整型在内存中的存储什么是大小端浮点数在内存中的存储浮点数在内存中的存储规则数据类型的介绍 在前面的章节中我们基本认识到了各种数据类型,这里我们就稍微回...
    99+
    2022-11-13
    C语言 数据存储 C语言 数据存储类型
  • 深入探索Golang中的数据类型与变量初始化
    深入探索Golang中的数据类型与变量初始化在Go语言中,数据类型和变量的初始化是我们常常需要面对的问题。正确的数据类型和变量的初始化可以确保程序的健壮性和正确性。在本文中,我们将深入探索Golang中的数据类型和变量初始化的相关知识,并给...
    99+
    2023-12-23
    数据类型 Golang 变量初始化
  • C语言中sizeof与整型数据存储及数据类型取值范围
    这篇文章主要讲解了“C语言中sizeof与整型数据存储及数据类型取值范围”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C语言中sizeof与整型数据存储及数据类型取值范围”吧!1.关键字si...
    99+
    2023-07-02
  • C++深入浅出探索数据结构的原理
    目录一、前言二、C++的数据结构三、定义结构四、访问结构成员五、结构作为函数参数六、指向结构的指针一、前言 因为C++的数据结构很多,很复杂,一篇文章根本讲不到所有的数据结构。即使写...
    99+
    2022-11-13
  • c语言深度解剖(数据类型关键字)
    1. 前面说点话上一个章节嵌入式Linux:c语言深度解剖(入门篇)zhuanlan.zhihu.com写完后,很多看完的人都想把我按在地上摩擦,咬牙切齿不足解恨,但是也有很多人表示支持,在此,鄙人表示感谢。这个章节说下C语言的关...
    99+
    2023-06-03
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作