首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C语言深度剖析:整型与浮点数在内存中的存储(详解原码反码补码+大小端+IEEE 754)

C语言深度剖析:整型与浮点数在内存中的存储(详解原码反码补码+大小端+IEEE 754)

作者头像
码途随笔
发布2026-01-12 20:03:36
发布2026-01-12 20:03:36
1100
举报

一、整数在内存中的存储

整数的二进制位有三种:原码、反码、补码,内存存放的是补码 有符号位最高位表示0\1,0代表正,1代表负 正整数的原、反、补相同 负整数三种表示方法都不同

补码在内存中存储的时候有大小端?那它到底是什么呢?

二、大小端字节序

2.1 大小端

当一个数据的大小超过一个字节的大小时,就有不同的存储的顺序问题,分为大端字节序存储和小端字节序存储。 理论上怎么存放数据都行,只要拿的出来数据就行,具体怎么存我们并不关心,但是也不能采用随便乱放(因为拿出来不方便) 因为顺序是以字节为单位存储的,所以叫大端字节序存储和小端字节序存储。而”大小端“是由格列夫游记小说灵感(历史原因)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

由此可以看出当前VS采用的是小端存储(与当前的硬件是有关系的)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 判断大小端

要想解决这个问题,先要想办法拿到里面的第一个字节?

代码语言:javascript
复制
int check_sys()
{
	int n = 1;
	return *(char*)&n;
}
int main()
{
	int ret = check_sys();
	if (ret == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
}

注意:不能够直接强制类型转化(char)c=(char)n,因为强制类型转化总是拿到的是最低位的字节,无论大端还是小端,都先把数据拿出来只取最后一位字节(最低位),没办法判断是否为大端还是小端

2.3 char的理解

signed char的理解方式:

在这里插入图片描述
在这里插入图片描述

unsigned char 的理解方式

在这里插入图片描述
在这里插入图片描述

题目分析:

在这里插入图片描述
在这里插入图片描述

先把要赋值的整数的补码(判断正负号)写出来,从后往前取8位,虽然a、b、c三者的类型都不相同,但是里面存放的是都是8个1,但是该如何去看里面的值是什么,需要看三者的类型了,另外char以整形的方式打印需要整形提升(取决于三者的类型),有符号位按照符号位提升,无符号为补零,提升完依然是补码,%d以有符号打印出来需要判断补码的正负号(如果是%u就不需要判断了,也不需要转为原码,因为%u不存在原、反、补),进一步转化并打印原码

在这里插入图片描述
在这里插入图片描述

易错点:

  • 当整数赋值给char类型的数据时看,即使超出了char类型存储的范围(char是-128~127、unsigned char是0 ~255),先存进去再说,存进去不一定是原来的值
  • 类型决定了如何看待里面的数据(整型提升时、以%d/%u打印时)

2.4 char 的循环

在这里插入图片描述
在这里插入图片描述

例题讲解: 题一:

在这里插入图片描述
在这里插入图片描述

答案是255 题二:

当指针强转为整形加一时,该如何去加?

在这里插入图片描述
在这里插入图片描述

补充:如果想打印十六进制的前面的0x 可以在%后面加#

在这里插入图片描述
在这里插入图片描述

三、浮点数在内存中的存储

引入:

在这里插入图片描述
在这里插入图片描述

事实果真如图片上所示吗?

在这里插入图片描述
在这里插入图片描述

这个可以说明整形与浮点型的存储方式不一样

那浮点数该如何存储呢?如何解释这道题?

3.1 浮点数的存储

在这里插入图片描述
在这里插入图片描述

如何将十进制浮点数转为二进制呢?

这个需要看权重在小数点前是0、1、2、3……,小数点后是-1、-2、-3……,转化为科学计数法,也遵循十进制的转化方法,然后任何二级制都可以转化为国际标准的公式

在这里插入图片描述
在这里插入图片描述

所以只要存放公式里面的S、M、E这三个参数就行了,需要时再把它拿出来

3.2 如何存放到内存

在这里插入图片描述
在这里插入图片描述

M一定是大于等于并且小于等于2(一定可以化成),因为E可以是负数

在这里插入图片描述
在这里插入图片描述
  • 存M(有效值)的值(考虑后面的精度,只存小数点后面的位,不存第一位,因为第一位始终为1)
在这里插入图片描述
在这里插入图片描述
  • 存E的值(不是存真实值,还要加上中间值,因为E可以是负数)
在这里插入图片描述
在这里插入图片描述

3.3 浮点数如何取出来

  • E不全为0或1 已经知道如何存储,相反,拿出来就是反过来是一样的,E减去127(或1023),M前再加上1
  • 当E为全零时,表示±0(非常小的数字) 就把指数E直接当成1-127(或1-1027),并且有效数字不在加上1
在这里插入图片描述
在这里插入图片描述
  • E全为1(表示正负无穷大的数字)

有了以上知识,就可以理解刚开始的题目(本质上是所对应的是视角不同,往内存里面拿数据)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、整数在内存中的存储
  • 二、大小端字节序
    • 2.1 大小端
    • 2.2 判断大小端
    • 2.3 char的理解
    • 2.4 char 的循环
  • 三、浮点数在内存中的存储
    • 3.1 浮点数的存储
    • 3.2 如何存放到内存
    • 3.3 浮点数如何取出来
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档