C语言程序设计 第 10 讲 数据的存储

2023-05-16

数据的存储

  • 数据类型介绍
  • 数据的存储
    • 整数
    • 大端小端
    • 浮点数的存储规则

数据类型介绍

C语言基本内置类型

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

类型的意义:

  1. 类型决定了开辟内存空间的大小
  2. 决定了使用范围
// 1. 整形
char //字符类型底层存储的是字符的ASCII码值,所以归为整形
	unsigned char		//无符号
	signed char			//有符号
short
	unsigned short
	signed short
int
	unsigned int
	signed int
long
	unsigned long
	signed long
// 2. 浮点型
float
double

以上仅仅介绍了C语言当中的一些内置类型,C语言中还有许多派生类型,由用户自己定义,如数组类型,结构体类型,指针类型等。

数据的存储

整数

数据在内存中以二进制的形式存储,对于整数来说,整数的二进制有三种表示形式:原码、反码、补码
对于正整数,原码反码补码相同,负整数的三者需要进行换算
换算过程:

  1. 原码:负整数的原码最高位为符号位,1为负,0为正
  2. 反码:在源码的基础上,符号位不变,其余按位取反
  3. 补码:反码 +1 得到补码
//example
int a = -10;
// 原码:100000000000000000000000000001010
// 反码:111111111111111111111111111110101
// 补码:111111111111111111111111111110110

整数在内存中存储的是其补码
使用补码可以将符号位与数值域统一处理;且CPU中只有加法器,使用补码时加减法可以统一处理,运算过程相同,节省硬件电路。
在这里插入图片描述

大端小端

  • 大端存储:指数据的低位在内存的高地址中。数据的高位在内存的低地址中
  • 小端存储:指数据的低位在内存的低地址中。数据的高位在内存的高地址中
    在计算机存储中,以字节为单位进行存储,一个地址对应一个字节,一个字节是8bit,C语言中的数据类型存储大于1个字节时,存在字节分配问题,就出现了大端存储和小端存储。
    常用的X86结构为小端模式,KEIL C51为大端模式,很多ARM和DSP都是小端模式
// 一道笔试题
// 设计一个程序判断当前机器的字节序
// 程序 1
int check_sys()
{
	int i = 1;
	return (*(char*)&i);
}
int main()
{
	int ret = check_sys();
	if (ret = 1)
	{
		printf("小端存储\n");
	}
	else
	{
		printf("大端存储\n");
	}
	return 0;
}
// 程序2
int check_sys()
{
	union
	{
		int i;
		char c;
	}un;
	un. i = 1;
	return un.c;
}
// 练习1
int main()
{
	char a = 1;
	signed char b = -1;
	unsigned char c = -1;
	printf("a = %d, b = %d, c = %d", a, b, c);
}
// outcome:a = -1, b = -1, c = 255
// -1 的存储
// 原码:100000000000000000000000000000001
// 反码:111111111111111111111111111111110
// 补码:111111111111111111111111111111111
// a 的类型是 char,存入 11111111,最高位理解为符号位
// b 的类型是 signed char,存入 11111111,最高位理解为符号位
// c 的类型是 unsigned char,存入 11111111,最高位理解为有效数字
// 打印整数 %d 会发生整型提升
// a 补完是 111111111111111111111111111111111(补码)
// b 补完是 111111111111111111111111111111111(补码)
// c 补完是 000000000000000000000000011111111
// 练习2
int main()
{
	char a = -128;
	printf("%u\n", a);
	return 0;
}
// outcome:4294967168
// -128 的存储
// 原码:100000000000000000000000010000000
// 反码:111111111111111111111111101111111
// 补码:111111111111111111111111110000000
// a 的类型是char,存入10000000,最高位理解为符号位
// 无符号整形 %u 打印,发生整型提升
// a 补完整是 111111111111111111111111110000000,最高位理解为有效数字
// 练习3
int main()
{
	int i = -20;
	unsigned int j = 10;
	printf("%d\n", i + j);
	return 0;
}
// outcome:-10
// i 的存储
// 原码:100000000000000000000000000010100
// 反码:111111111111111111111111111101011
// 补码:111111111111111111111111111101100
// j 的存储
// 原/反/补码:000000000000000000000000000001010
// 加法运算按照补码进行
// 111111111111111111111111111101100	+
// 000000000000000000000000000001010	=	
// 111111111111111111111111111110110(补码)-->
// 111111111111111111111111111110101(反码)-->
// 100000000000000000000000000001010(原码)--> -10
// 练习4
int main()
{
	unsigned int i;
	for (i = 9;i > 0; i--)
	{
		printf("%u\n", i);
	}
	return 0;
}
// 死循环
// 练习5
int main()
{
	char a[1000];
	int i;
	for (i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d", strlen(a));
	return 0;
}
// outcome:255
// a = -1,-2,-3,...,-128,127,126,...,0,-1,-2,...
// strlen(a) 求 a 字符串长度,基本原则是遍历寻找 \0 作为字符串结束标志, \0 的ASCII码为 0

浮点数的存储规则

任意一个浮点数V可以表示成以下形式
(-1)^S*M*2^E

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

//example
-5.5(十进制) = -101.1(二进制) = -1.011 x 2^2
S = 1, M = 1.011, E = 2
  • 单精度浮点数(32位)
    在这里插入图片描述

  • 双精度浮点数(64位)
    在这里插入图片描述
    IEEE 745 对于 M 和 E 存储的规定:

  • 对于 M 存储
    由于 1 ≤ M ≤ 2,M = 1.xxxxxxxxx,默认 M 的第一个数字都是 1,故只存储小数点后面的数字,在读取得时候再加上 1,这样做可以保存小数点后 23 位有效数字。

  • 对于 E 的存储

  1. E 是一个无符号整数,如果 E 为 8 位,其取值范围为 0 ~ 255,若 E 为 11 位,其取值范围为 0 ~ 2047。
  2. 但实际上 E 的取值可以为负数。所以规定存入的 E 必须加上一个中间值。对于 8 位的 E,需要加上127;对于 11 位的 E,需要加上 1023。
  3. 取出 E 时分为 3 种情况
    1)E不全为1或不全为0
    E 的计算值减去加上的中间值(127 或 1023),得到其真实值,同时 M的有效数字前加上第一位 1。
    2)E全为0
    此时 E 等于 1-127 或 1-1023即为真实值,此时 M 不再补上第一位 1,直接还原为0.xxxxxxxxxxxx,这样可以表示±0.xxxxxxx,以及接近于0的很小的数字
    3)E全为1
    此时若 M 全为 0,则表示±无穷大
int main()
{
	int n = 9;

	float* pFloat = (float*)&n;
	printf("n = %d\n", n);
	// outcome:n = 9
	// 存入内存的四个字节(16进制表示):09 00 00 00
	printf("*pFloat = %f\n", *pFloat);
	// outcome:*pFloat = 0.000000
	// 9 -> 0000 0000 0000 0000 0000 0000 0000 1001
	// 以浮点数的角度读取
	// E 全为 0,表示一个很小的数字
	// V=(-1)^0 × 0.00000000000000000001001×2^(-126)=1.001×2^(-146)

	*pFloat = 9.0;
	// 以浮点数的形式存入9.0
	// 9.0 -> 1001.0 ->(-1)^0x1.001x2^3 -> s=0, M=1.001, E=3+127=130
	// 存入内存 0 10000010 001 0000 0000 0000 0000 0000
	printf("n = %d\n", n);
	// outcome:n = 1091567616
	// 以整数的角度都内存,为1091567616
	printf("*pFloat = %f\n", *pFloat);
	// outcome:*pFloat = 9.000000
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C语言程序设计 第 10 讲 数据的存储 的相关文章

  • Modelsim解决中文注释乱码

    Modelsim中文注释出现乱码 xff0c 解决过程如下 1 菜单栏 Tools Preferences xff0c 点击By name 2 找到source选项 xff0c 下拉选项中双击encoding 3 弹出的对话框中将encod
  • 【资料分享】IMAX-B6AC充电器使用方法

    因为说明书都是英文的嘛 xff0c 所以 xff0c 还是写个充电方法吧 刚打开的时候 xff0c 界面应该是这个样子的 如果很不幸 xff0c 你的不是 xff0c 那么 xff0c 多按几次Stop键 xff0c 直到它是这个界面 菜单
  • GPIO简介

    1 什么是GPIO xff1f GPIO是General Purpose Input Output xff0c 即通用输入输出端口 xff0c 简称GPIO 作用 xff1a 负责采集外部器件的信息或者控制外部器件工作 xff0c 即输入输
  • 多目标跟踪入门:从SORT到FairMOT

    点击下方卡片 xff0c 关注 自动驾驶与AI 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之心 目标跟踪 技术交流群 后台回复 目标跟踪综述 获取单目标 多目标 基于学习方法的领域综述 xff01 目标跟踪分为单目标
  • STM32的四种开发方式

    STM32的四种开发方式 首先看下ST官方给出的四种开发方式的比较 寄存器开发 寄存器编程对于从51等等芯片过渡过来的小伙伴并不陌生 xff0c 不管你是什么库 xff0c 最终操作的还是寄存器 xff0c 所以对于标准库 HAL库 LL库
  • STM32物联网项目-串口打印

    串口打印 1 用STM32CubeMx配置串口 串口1模式选择异步 xff0c 不开启硬件控制流 波特率 xff1a 115200 数据长度 xff1a 8位 校验位 xff1a 无 停止位 xff1a 1位 使能接收和发送 重复采样 xf
  • STM32使用串口空闲中断(IDLE)和 DMA接收一串数据流

    STM32使用串口空闲中断 xff08 IDLE xff09 和 DMA接收不定长数据 方法一 使用宏定义判断IDLE标志位 空闲的定义是总线上在一个字节的时间内没有再接收到数据 xff0c USART IT IDLE空闲中断是检测到有数据
  • 串口通信printf函数重定向

    串口通信printf函数重定向 printf函数重定向在51单片机的串口通讯也使用过 xff0c 但51重写的时putchar函数 xff0c 这次STM32重写的是fputc函数和fgetc函数 xff0c 至于为什么51和STM32重写
  • GPS NMEA数据包解析

    GPS NMEA数据包解析 NMEA 0183是美国国家海洋电子协会为海用电子设备制定的标准格式 它包含了定位时间 xff0c 纬度 xff0c 经度 xff0c 高度 xff0c 定位所用的卫星数 xff0c DOP值 xff0c 差分状
  • CAN通信

    CAN的通信速率按照电调的手册要求的1Mbps配置 xff0c 71 42854142857473ns xff08 9 43 4 43 1 xff09 61 1000ns 61 1us 61 1Mbps CAN总线的一个数据帧中所需要传输的

随机推荐

  • 网络传输:linux下的网络请求和下载(ping wget curl)、端口

    一 下载和网络请求 1 ping命令 可以通过ping命令 xff0c 检查指定的网络服务器是否可连通状态 语法 xff1a ping c num ip或主机名 选项 xff1a c 检查的次数 xff0c 若不使用 c xff0c 将无限
  • python的 ping 网络状态监测方法(含多IP)

    ping 基本概念 ping xff08 Packet Internet Groper xff09 是一种因特网包探索器 xff0c 用于测试网络连接量的程序 Ping是工作在 TCP IP网络体系结构中应用层的一个服务命令 xff0c 主
  • MS5611气压传感器中文资料

    MS5611是新一代高分辨率气压传感器 xff0c 分辨率可达10cm 其内置24位AD转换器 xff0c 支持IIC和SPI通讯协议 xff0c 传输速率可达20MHz 其转换时间可以设置 测量 工作范围 xff1a 10 1200mba
  • STM32学习——串口数据收发

    STM32学习 串口数据收发 61 61 STM32的串口通信 61 61 61 61 HAL库中串口发送的重要函数 61 61 61 61 STM32定时器实训 61 61 STM32的串口通信 异步串行通信 xff1a 通信双方在没有同
  • 赛目科技2023校园招聘火热进行中!(算法/开发等多个岗位)

    点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之心 求职交流 技术交流群 一 赛目概况 我们是专注于仿真技术自主创新的技术驱动型公司 xff0c 主要从事 ICV 仿真测 试
  • 多模态运动数据采集系统

    为给研究人员提供更多有效的多模态同步数据集 xff0c 合肥工业大学的程景铭团队设计了一个多模态运动数据采集系统 xff0c 采集了包含全身运动多模态数据集 xff0c 并利用已有算法对数据集进行了评估测试 多模态运动数据采集系统 多模态运
  • 【STM32】 STM32 F4 串口通讯

    概念 串口 xff0c 即串行接口 xff0c 是一种可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去 xff0c 同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件 串口通信 xff08 Serial Commu
  • 【安装】安装ros机器人系统和无人机环境配置常见问题总结

    安装ros机器人系统和无人机环境配置常见问题总结 一 安装ROS二 无人机环境配置更多安装 Ubuntu16 04安装ros xff1a http wiki ros org cn kinetic Installation Ubuntu Ub
  • ubuntu18.04搭建python环境

    注意 xff1a 我使用的是虚拟机 xff0c 在操作前请确保虚拟机可以访问到网络 1 安装python3 9 0解释器 xff0c 配置环境变量 2 配置虚拟环境 一 安装python3 9 0 到 opt python39 更新软件源
  • vscode生成的exe文件出现中文乱码的问题

    问题描述 vscode生成的exe文件出现中文乱码的问题 解决方案 xff1a 头文件处添加 xff1a span class token macro property span class token directive hash spa
  • c++进行函数重载时报错:此运算符函数的参数太多C/C++(344)

    问题描述 c 43 43 进行函数重载时报错 xff1a 此运算符函数的参数太多C C 43 43 344 原因分析 xff1a C 43 43 中类内运算符重载时只能有且仅有一个参数 解决方案 xff1a 方案一 xff1a 将重载函数作
  • c++中加入随机种子的方法

    c 43 43 中加入随机种子的方法 提示 xff1a c 43 43 中加入随机种子的方法 解决方案 xff1a span class token macro property span class token directive has
  • STM32 第5讲 MDK下载安装注册及配置

    目录 MDK下载安装注册MDK简介MDK下载MDK安装器件支持包安装注册鸡 MDK配置 MDK下载安装注册 MDK简介 MDK不同版本对比 MDK下载 MDK安装使用 61 MDK软件安装 43 器件支持包安装 MDK软件下载 xff1a
  • STM32 第7讲 STM32F407系列系统架构及映射

    Cortex M内核 amp 芯片 F407系统架构 注 xff1a 64KB CCM 内核耦合存储器 数据 RAM不属于总线矩阵 xff0c 只能存数据 xff0c 不支持DMA xff0c 但访问速度快 总线矩阵 xff1a 总线矩阵用
  • 稳了!理想汽车一季报亮眼,禾赛或成大赢家

    作者 Alan 编辑 激光雷达老炮儿 点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 5月10日 xff0c 理想汽车公布2023年第一季度财报 xff0c 季度营收和交付量双双创下历史新高 第
  • STM32 第9讲 STM32CubeMX简介安装和简单使用

    文章目录 STM32CubeMX安装安装JAVA环境安装STM32CubeMX下载关联STM32Cube固件包 新建工程芯片选型配置时钟源时钟树配置GPIO引脚配置Debug选项配置生成工程编写逻辑代码 STM32CubeMX安装 STM3
  • STM32 第11讲 正点原子SYSTEM文件夹介绍及使用(sys/delay/usart)

    文章目录 sys文件夹delay文件夹函数简介Systick定时器工作原理寄存器函数介绍 usart文件夹printf函数输出流程printf函数的使用printf函数支持微库法代码法 SYSTEM 文件夹里面的代码由正点原子提供 xff0
  • STM32 第20讲 通用定时器(简介/框图/时钟源)

    通用定时器 简介定时器框图时钟源计数器时钟源寄存器设置方法内部时钟 CK INT 外部时钟模式1 xff08 TI1 TI2 xff09 外部时钟模式2 xff08 ETR xff09 内部触发输入 xff08 ITRx xff09 基本定
  • C语言程序设计 第 9 讲 初识结构体

    初识结构体 结构的声明结构成员的类型结构体变量的定义和初始化结构体成员的访问结构体传参 结构是一些值的集合 xff0c 结构体的值类型可以不同 xff0c 这些值称为结构体的成员变量 结构的声明 span class token keywo
  • C语言程序设计 第 10 讲 数据的存储

    数据的存储 数据类型介绍数据的存储整数大端小端浮点数的存储规则 数据类型介绍 C语言基本内置类型 span class token keyword char span span class token comment 字符数据类型 span