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

目录
  • 前言
  • 1、数据类型介绍
    • 类型的基本归类
  • 2、整形在内存中的存储
    • 2.1 原码、反码、补码
    • 2.2 大小端介绍
      • 2.2.1 什么是大小端
      • 2.2.2 大端和小端意义
      • 2.2.3 写程序判断字节序
  • 总结

前言

本文开始学习C语言进阶的内容了,进阶内容,是在基础阶段的内容上进行拓展,有的知识点,在基础阶段也已经学过。在进阶内容中,将从更深层次的角度去理解学习,本文主要内容包括:

  • 数据类型详细介绍
  • 整形在内存中的存储:原码、反码、补码
  • 大小端字节序介绍及判断
  • 浮点型在内存中的存储解析

1、数据类型介绍

在基础阶段已经学习了基本的类型和存储空间的大小。

知道了使用某个类型开辟内存空间的大小(大小决定了使用范围)。

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

类型的基本归类

整形家族

char
    unsigned char//无符号
    signed char//有符号
short
    unsigned short [int]//无符号
    signed short [int]//有符号
int
    unsigned int//无符号
    signed int//有符号
long
    unsigned long [int]//无符号
    signed long [int]//有符号

浮点数家族

float
double

构造类型

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

指针类型

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

空类型

void 表示空类型(无类型)

通常应用于函数的返回类型、函数的参数、指针类型

2、整形在内存中的存储

一个变量的创建是要在内存中开辟空间的。空间的大小是根据变量的类型而决定的

//举例
int a = 20;
int b = -10;

int 为整形,占用4个字节,下面将具体分析变量 a 的数值20 在内存空间中是如何分配的

2.1 原码、反码、补码

计算机中的整数有三种表示方法,即原码、反码和补码:

  • 原码:直接将二进制按照正负数的形式翻译成二进制就可以
  • **反码:**将原码的符号位不变,其他位依次按位取反就可以得到了
  • **补码:**反码+1就得到补码

三种表示方法均有符号位和数值位两部分:

  • 符号位都是用0表示“正”,用1表示“负”
  • 正整数数的原、反、补码都相同
  • 负整数的三种表示方法各不相同

注意,整数存放在内存中的是补码,操作符的对象都是补码,最后打印的是原码。

举例说明数值的原码、反码、补码,

//
int main()
{
	int a = 10;//正数
	00000000 00000000 00000000 00001010 原码
	00000000 00000000 00000000 00001010 反码
	00000000 00000000 00000000 00001010 补码
	a在内存中的存储形式 00 00 00 0a
	int b = -10;//负数
	10000000 00000000 00000000 00001010 原码
	11111111 11111111 11111111 11110101 反码
	11111111 11111111 11111111 11110110 补码=反码+1
	b在内存中存储的数值 ff ff ff f6
	return 0;
}

a的数值在内存中的存储形式:

b的数值在内存中的存储形式:

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;

由于CPU只有加法器,加法和减法也可以统一处理,此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

下面将举例说明,数据在内存中的操作是运用补码而不是原码的:

int main()使用补码计算,打印的是原码
{
	1-1//CPU只有加法器
	1+(-1)
	第一步:
	00000000 00000000 00000000 00000001  1补码
	第二步:
	10000000 00000000 00000000 00000001  -1原码
	11111111 11111111 11111111 11111110  -1反码
	11111111 11111111 11111111 11111111  -1补码
	第三步:补码相加
	00000000 00000000 00000000 00000001  1补码
	11111111 11111111 11111111 11111111  -1补码
	结果是33位,超出范围
   100000000 00000000 00000000 00000000
	00000000 00000000 00000000 00000000   截断32位为0

	如果使用原码计算,结果是错误的
	00000000000000000000000000000001  1补码
	10000000000000000000000000000001  -1原码
	10000000000000000000000000000010  -2
}

2.2 大小端介绍

2.2.1 什么是大小端

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

2.2.2 大端和小端意义

  • 因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit
  • 但是在C语言中除了8 bit的char之外,还有16 bit的short型,32 bit的long型(要看具体的编译器)
  • 另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式

举例说明大小端,例如:一个 16bit 的 short 型 x ,在内存中的地址为 0x0010 , x 的值为 0x1122 ,那么 0x11 为高字节, 0x22 为低字节。

  • 对于大端模式,就将 0x11 放在低地址中,即 0x0010 中, 0x22 放在高地址中,即 0x0011 中
  • 对于小端模式,刚好相反

我们常用的 X86 结构是小端模式,而 KEIL C51 则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

int main()
{
	int a = 0x11223344;
	return 0;
}

低字节0x44挡在低地址中,因此是小端模式:

2.2.3 写程序判断字节序

设计一个小程序来判断当前机器的字节序

int checksys()
{
	int a = 1;//00 00 00 01
	char* ch = (char*)&a;//char* 截断字节,指针指向低地址数据
	return *ch;//解引用,返回低地址数据
	//return *(char*)&a;//上面两行代码也可写成一行代码
}
int main()
{
	int a = checksys();
	if (a==1)//如果低地址保存的数据是1,即0x01,就是低字节
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

总结

数据的存储的学习还没有结束。

下一篇内容继续学习数据的存储相关的知识点。

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

(0)

相关推荐

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

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

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

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

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

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

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

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

  • 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语言数据的存储详解

    目录 数据类型的介绍 整形 浮点型 构造类型 指针类型 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语言数据的存储超详细讲解下篇浮点型在内存中的存取

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

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

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

  • C语言指针超详细讲解上篇

    目录 前言 1.指针是什么 1.1 指针变量 1.2 指针是内存中一个最小单元的编号 2.指针和指针类型 2.1 指针±类型 2.2 指针的解引用 2.2.1 int* 类型的解引用 2.2.2 char* 类型的解引用 3.野指针 3.1 野指针成因 3.1.1 指针未初始化 3.1.2 指针越界访问 3.1.3 指针指向的空间释放 3.2 如何规避野指针 总结 前言 本文开始指针相关内容的学习,主要内容包括: 指针是什么 指针和指针类型 野指针 指针运算 指针和数组 二级指针 指针数组 1.

  • C语言操作符超详细讲解上篇

    目录 前言 1.操作符的分类 2.算术操作符 3.移位操作符 3.1 左移操作符 3.1.1 正数左移1位 3.1.2 负数左移1位 3.2 右移操作符 3.2.1 正数右移1位 3.2.2 负数右移1位 3.3 移位操作符说明 4.位操作符 4.1 练习 1 4.2 练习 2 总结 前言 操作符主要内容包括:各种操作符的介绍,用表达式求值. 1.操作符的分类 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用.函数调用和结构成员

  • C语言函数超详细讲解上篇

    目录 前言 1.函数是什么? 2.C语言中函数的分类 2.1 库函数 2.1.1 如何学会使用库函数 2.1.2 自定义函数 3.函数的参数 3.1 实际参数(实参) 3.2 形式参数(形参) 4.函数的调用 4.1 传值调用 4.2 传址调用 4.3 练习 4.3.1 判断一个数是不是素数 4.3.2 判断一年是不是闰年 4.3.3 二分查找 4.3.4 数值自增增加1 5.函数的嵌套调用和链式访问 5.1 嵌套调用 5.2 链式访问 总结 前言 本文主要学习函数的相关内容. 1.函数是什么?

  • 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

随机推荐