C语言中数据的存储详解

目录
  • 1.内置类型
    • (1)整型数组
    • (2)浮点型
  • 2.自定义类型
  • 3.指针类型
    • 字符型
    • 浮点型
      • (一)
      • (二)
  • 总结

数据的存储首先就要说到数据的类型,类型决定了看待内存空间的视角。

C语言的数据类型分为内置类型和外置类型

1.内置类型

(1)整型数组

char(字符型)、short(短整型)、int(整型)、long(长整型)(signed 或者 unsigned

(2)浮点型

float(单精度浮点型)、double(双精度浮点型)

2.自定义类型

(1)数组类型

此处需要注意的是,去掉数组名就是数组的类型

比如int arr[10],去掉数组名arr,int [10]就是数组数据类型

(2)结构体类型(struct

(3)枚举类型(enum

(4)联合类型(union

3.指针类型

4.空类型(void)

数据的存储形式就是以计算机的原码反码补码进行存储的

浮点型:不以原反补的形式进行存储

其他的数字又分为有符号数和无符号数

无符号数:无符号数的原反补三种码是一致的,存储的时候没有区别

符号数来:正数的原反补码是相同的,但是负数的原反补码需要经过运算转化(正数的最高位是0,负数的最高位是1)

原码:将二进制按照正负数形式翻译为二进制数字

反码:将原码的每一位取反

补码:反码+1

存储的时候一般存储数字的二进制序列补码

同时数据的存储存在大小端

内存空间具有编号,编号小的为低地址,编号大的为高地址

大端存储:数据的低位保存在内存的高地址中

小端存储:数据的低位保存在内存的低地址中

每个机器的存储方式不同,可以用如下一段简单代码来观察电脑是哪一种存储方式

#include<stdio.h>
int main()
{
	int a = 1;
	char* p = (char*)&a;
//此处将整型地址强制转化为字符型
//强制转化并不影响地址的存储,只会影响读取
//指针决定读取内存的位数,字符型指针在解引用时只解1字节,整型指针在解引用时解4字节
//a存储时,a是正数,原反补相同
//00000000 00000000 00000000 00000001
//指针在强制转化为字符型之后只能读取该内存的前8位
//如果该指针解引用后结果是1,该数据存储结果为00000001 00000000 00000000 00000000
//如果不是,该数据存储结果为00000000 00000000 00000000 00000001
	if (*p == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

字符型

char/signed char 所对应的存储区间为-128~127,同时规定10000000为-128。

为了理解signed与unsigned,适用如下例题

#include<stdio.h>
int main()
{
	unsigned int i;
	for (i = 9; i >= 0; i--)
//在这个循环开始之前就需要注意到,i需要小于0,该循环才会停止
//但是此时的i是一个unsigned类型,本身存储的时候并没有预留符号位,是没有办法破开循环的
//该循环是死循环
	{
		printf("%d", i);
	}
}

signedunsigned的区别就在于能否表示正负数

在数据的存储时,是否存在符号位

signed char与char类型的存储也可以用一个图来说明

中间的分界线即为正负分界线,第一位即为符号位。符号位为1是负数,符号位为0即为正数

理解char的存储范围,借用如下例题

#include<stdio.h>
#include<string.h>
int main()
{
	char a[1000];
	int i;
	for (i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d", strlen(a));
	return 0;
}
//i是int类型,可以随着循环不断增长,但是对于a这个数组来说,能存储的数据有限。
//数组a是字符型,字符型数组能存储的范围就是-128~127之间,一共255个数,所以数组长度也是255

运行结果:255

int等类型的存储方式与char相似,这里就不在多做赘述

利用一个例子来证明浮点型存储与整型存储不同

#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("n的值为:%d\n", n);
	printf("*pfloat的值为:%f\n", *pfloat);
//此处通过单精度浮点型的指针更改原本存储在整型中的数字,并将其更改为单精度浮点型数字
	return 0;
}

输出结果:

n的值为:9
*pfloat的值为:0.000000
n的值为:1091567616
*pfloat的值为:9.000000

由此可见,单精度浮点型的指针并不能成功取出原本存储在整形中的数字,而第二步中通过单精度浮点型的指针所更改的整形的值,n也无法成功取用,所打出来的数字并不是9。由此可见二者的存储方式是存在较大差异的,所以下面对浮点型的存储方式进行讲解。

浮点型

浮点型并不依靠数据的原反补码进行存储

浮点型有其特殊的规定

(E也可以理解为最高此项所对应的阶次)

用实例来证明一下

比如8.5这个浮点数

转化为二进制

1000.1

对于这个数而言,存储成图中形式就是

(-1)^0*1.0001*2^3

存储就是

0 00000011 00000000000000000010001

此时假设我们所申请到的内存是一个条状,那么对于浮点数而言的数据存储方式如图所示

 

 单精度浮点型对应的就是图一中所示,SME分布在不同的位置,图二的所示为双精度浮点型,双精度与单精度浮点型所对应的E与M不同。

(一)

就是E的值,既不能全为0,也不能全为1,且E的存储值与真实值不相同

为了表示极小的小数,比如1*10^-10,因为E本身不具有符号位,所以不能表示负数

单精度:E=真实值+127

双精度:E=真实值+1023

加完之后再转化为二进制存储为E,拿出来使用的时候再将这个数字减去

特殊情况1:E为全0

单精度的E此时的真实值为-127,该浮点数几乎等于0,是一个几乎不存在的数字

特殊情况2:E为全1

单精度的E此时的真实值为128,该浮点数是为正负无穷大的数字

(二)

对于M来说,M的值既然是在区间【1,2)之间,则位于整数部分的肯定为1

再次利用单精度浮点型存储8.5

该数字的M为1.0001

为了能让浮点数表达更大的数字,且M中处于个位的数字固定为1,之后就规定,M中个位的1可以不再进行存储,等到取用的时候再进行添加。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

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

    前言 1. 数据类型详细介绍 2. 整形在内存中的存储:原码.反码.补码 3. 大小端字节序介绍及判断 4. 浮点型在内存中的存储解析 一.数据类型介绍 1.类型的基本归类 1.整形家族 char unsigned char signed char short unsigned short [int] signed short [int] int unsigned int signed int long unsigned long [int] signed long [int] 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语言 数据存储方式知识点详解

    C语言 数据存储方式 一.源码 一个数的原码(原始的二进制码)有如下特点: 最高位做为符号位,0表示正,为1表示负 其它数值部分就是数值本身绝对值的二进制数 负数的原码是在其绝对值的基础上,最高位变为1 下面数值以1字节的大小描述: 十进制数 原码 +15 0000 1111 -15 1000 1111 +0 0000 0000 -0 1000 0000 注:原码表示法简单易懂,与带符号数本身转换方便,只要符号还原即可,但当两个正数相减或不同符号数相加时,必须比较两个数哪个绝对值大,才能决定谁减

  • C语言数据存储详解

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

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

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

  • C语言数据的存储详解

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

  • R语言中因子相关知识点详解

    因子是用于对数据进行分类并将其存储为级别的数据对象. 它们可以存储字符串和整数. 它们在具有有限数量的唯一值的列中很有用. 像"男性","女性"和True,False等.它们在统计建模的数据分析中很有用. 使用factor()函数通过将向量作为输入创建因子. 例 # Create a vector as input. data <- c("East","West","East","North

  • C语言中的文件操作详解

    目录 1.为什么使用文件 2.什么是文件 2.1程序文件 2.2数据文件 2.3文件名 3.文件的打开和关闭 3.1文件指针 3.2文件的打开和关闭 4.文件的顺序读写 5.文件的随机读写 5.1fseek 5.2ftell 5.3rewind 6.文本文件和二进制文件 7.文件读取结束的判定 7.1被错误使用的feof 8.文件缓冲区 结论 1.为什么使用文件 在学习结构体时,写了一个简易的通讯录的程序,当程序运行起来的时候,可以在通讯录中增加和删除数据,此时数据是存放在内存当中的,当程序退出

  • 从go语言中找&和*区别详解

    *和&的区别 :& 是取地址符号 , 即取得某个变量的地址 , 如 ; &a*是指针运算符 , 可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 , 也就是这个地址所存储的值 . 从代码中验证 : 先构建一个Rect类型 : 1. &是取地址符号, 取到Rect类型对象的地址 2. *可以表示一个变量是指针类型(r是一个指针变量): 3.*也可以表示指针类型变量所指向的存储单元 ,也就是这个地址所指向的值 4.查看这个指针变量的地址 , 基本数据类型直

  • C语言中随机数rand()函数详解

      在生活中很多场景下都需要产生随机数,比如抽奖,打牌,游戏等场景下就需要使用随机数.在C语言标准库函数里面有专门用来产生随机数的函数rand,它的函数原型如下: int __cdecl rand(void);   rand函数没有参数,它的返回值就是随机数.下面通过一个简单的例子来测试一下rand函数. #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { int i; i = rand(

  • MySQL中数据视图操作详解

    目录 1.视图概述 1.1创建视图 1.2视图的查询 2.操作视图 2.1通过视图操作数据 2.2修改视图定义 2.3删除视图 1.视图概述 视图是从一个或多个表(或视图)导出的表.视图与表(有时为与视图区别,也称表为基本表)不同,视图是一个虚表,即视图所对应的数据不进行实际存储,数据库中只存储视图的定义,对视图的数据进行操作时,系统根据视图的定义去操作与视图相关联的基本表. 视图一经定义,就可以像表一样被查询.修改.删除和更新.使用视图有下列优点: 1.为用户集中数据,简化用户的数据查询和处理

  • Go语言中基本数据类型的相互转换详解

    目录 基本数据类型的相互转换 基本语法 小知识 基本数据类型和string的转换 方法一 方法二 string和基本数据类型转换 基本数据类型的相互转换 Go在不同类型的变量之间赋值时需要显示转换,不能自动转换 基本语法 表达式 T(v): 将值v转换成类型T T就是数据类型: int32, int64, float32... v就是需要转换的变量 1.不考虑溢出的情况下,类型转换不会改变数值大小 var i int8 = 100 var n int32 = int32(i) fmt.Print

  • 易语言中数据库“更新索引”命令详解

    通过完全重建来更新当前数据库的当前索引. 成功返回真,失败返回假. 语法: 逻辑型 更新索引 () 例程: 说明: 打开数据库的同时,打开2个索引文件."更新索引"按钮被单击后,运行"更新索引()"命令,成功更新索引后,将当前打开的索引显示在列表框中. 以上就是易语言中数据库"更新索引"命令详解的详细内容,更多关于易语言更新索引命令的资料请关注我们其它相关文章!

  • C语言中 & 和 &&的区别详解

    这是c语言的基本语法,但是在学习的过程中也总是搞混.所以记录一下,也和大家分享一下. &:按照位与操作,例如:0010&1101,结果为0000 &是java中的位逻辑运算:       eg: 2&3=2: 分析如下: 2的二进制为10 :3的二进制为11 : 逻辑&之后为10 &&:短路与,表示如果两个条件都成立则执行之后的逻辑: 例如:if(a==0&&b==0),意思就是if a为0并且b为0的时候,进行下一步操作. || 短

随机推荐