news 2026/1/28 5:57:44

整数、浮点数的内存中存储

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
整数、浮点数的内存中存储

引言

两种数据在C语言中都十分的重要,很有必要都掌握清楚。

一、整数

以我们常见的数字进制来说,生活中普遍为十进制的数字,遇十进一,但是计算机由于其底层逻辑的影响,采取了二进制的方式存储数据。常用的编译器还会采取十六进制来简化显示的界面。

1.十进制向二进制的转换

对于整数来说,都可以精确的化为二进制所表示数字。

有一个简单的方法就是对十进制下的数字采取除2取余数的方式,以数字114为例:
114除2得57余下0;

57除2得28余1;

28除2得14余0;

14 除 2 得 7 余0;

7除2 得 3 余 1;

3 除 2 得1 余 1 ;

1 除 2 得 0 余 1 ; 此时终于结束,把所得余数按先后顺序连接,得到1110010;

而114的二进制恰巧为此数,

想知道为什么的可以尝试将114表示为二的多少次方的相加,对等式两边进行除2操作。

2.计算机中的正数

已知计算机中存储的是二进制的数字,对于正数而言,它们在内存中就是二进制的表示形式,

前面的要补上0,到它所有的位数。

3.计算机中的零

全为零:

0000 0000 0000 0000 0000 0000 0000 0000 0000

4.计算机中的负数

首先补充点计算机的处理器的知识:

  • 硬件需求:加法电路的设计相对简单(可通过“异或门”实现本位和、“与门”实现进位,如半加器/全加器),而减法电路需要额外的借位处理逻辑,会增加硬件复杂度与成本。早期计算机资源有限,复用加法电路处理减法是更优选择。

  • 减法转加法的可行性:通过补码机制,减法可转换为加法运算(即 A−B=A+(−B))。只需将减数转换为其补码(负数的补码表示),再通过加法器计算,即可得到正确结果。这种方式无需额外减法电路,大幅简化了硬件设计。

重点:发明的原码、反码和补码完善了负数的储存

首先,假设我们处理的是32个比特长度的 int 类型数据,一个比特对于一个二进制位,那么一共有32位,把这32位分成两类,从左往右的第一位为符号位,0 代表正数,1代表负数。

剩下的31 为存储相关的信息:

1.原码 把负数的绝对值转换为二进制,之后在前面加上符号位就得到了原码。

此处以 - 114 举例 就有10000000 00000000 00000000 01110010;

2.反码 符号位保持不变,其余按位取反,

得 11111111 11111111 11111111 10001101;

3.补码:反码直接在最后加1

得 11111111 11111111 11111111 1001110;

补充运算小技巧:补码进行符号位不变,取反加1可以得到原码。

最重要的一点来了,计算机中的负数全部存储的是补码,且正数和 0 原码就是补码、反码

当正数与负数做运算时,直接让他们的补码相加,得到的就是结果,

例如正数114与 -114 相加

两者分别为 00000000 00000000 00000000 01110010

11111111 11111111 11111111 1001110

易得相加后结果为 00000000000000000000000000000000,也就是0

由此可见,原本的负数可以用补码来表示,并且完美搭配处理器的加法功能。

5.大小端字节序

介绍

内存存储数据时,采取的是以字节为单位的存发

对于四个字节的整型,那它的数字的二进制形式就被分成了四段

对二进制所表示的大小从高到低,分为高位字节内容和低位字节内容,原理上是用的二进制,但是在 vs2026 里面的显示形式为16进制,这是为了人类看数据的时候更加简洁,而不是一长串的0101.

当低位字节内容在低地址。高位字节内容在高地址,这个叫小端字节序

反之,低位高,高位低,这样叫大端字节序。

比如我在vs2026编译器中建立一个值为 0x11223344 的整型变量

明显可以看出,低地址存的是低位字节的数据,高地址存的是高位字节的数据

即vs2026环境下用的是 小端字节序

影响

大小端字节序影响的是每位地址所对应的值,就以变量 int a = 0x11223344举例,

在小端字节序下,&a 对应的是 a 的后面8个二进制位的值,也对应着十六进制下的44

在大端字节序下,&a 对应的是 十六进制下的11。

这个迥然不同的差异,可以被拿来出各种各样的题型,也能造成 bug ,考验你把char (unsigned)类型的数据赋值了a的地址的强制char *类型转换的解引用,所得到 char数据中实际的值是什么,还可以替换 char 为 short,变换无穷,但本质就是那点知识

判断

请你写一个简单的大小端判断的代码,检验你的 IDE 所处的环境。

主要是利用一个内存占用在两个字节以上的变量,并在两个字节中保证好不是同一个值,

再利用char * 以及 char 类型来得到变量地址所对的值是多少,最终判断出大小端。

二、浮点数

浮点数不遵循上述的原码、反码和补码的规则,有自己一套的新存储方式

且不同类型的浮点数的存储方式略有不同

大体上采取了符号位,指数位,有效数字位:

相信我们都熟练掌握了十进制的科学计数法,而二进制的科学计数法跟浮点数有着莫大的关系。

以2为底,非零的浮点数可以表示为可判断正负的1打头的小数点后接多少多少有效数字的再乘上以二为底的多少次方的一个数,如下

对应到float 类型的变量,前面的 s 占一位,中间的指数部分占8位,后面的有效数字位占23位

注意事项

1.M的小数总处于1~2 的左闭右开区间,因此把小数部分保留,整数部分1舍去,这样能多保存一位数字

2.E位部分是无符号整型,但是实际中2的指数可以为负数,因此采取对负数加127的操作,

未完待续

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/27 12:29:51

边界之内:为何高维内插无法催生下一次科学革命?

在一个被大数据和人工智能的承诺所笼罩的时代,一种信念日益深入人心:只要有足够的数据和强大的算法,我们就能自动解锁自然界最深邃的奥秘。机器学习模型在蛋白质折叠、材料发现和气候预测等领域取得的惊人成就,似乎都在为这一愿景…

作者头像 李华
网站建设 2026/1/28 5:24:06

Spring Boot 三种方式登录系统:集成微信扫码、短信验证码、邮箱验证码

Spring Boot 三种方式登录系统:集成微信扫码、短信验证码、邮箱验证码(含高并发与安全增强) 主要因为前面的帖子不太完整。 一、引言 在现代 Web 应用中,提供多种灵活、安全的登录方式已成为标配。本文档旨在提供一套生产就绪的…

作者头像 李华
网站建设 2026/1/27 17:57:14

HTML5 与 H5:别再让你的专业度在称呼中流失

在中国互联网行业的日常交流中,很少有一个词像“H5”这样被高频使用,却又被如此普遍地误解。当你听到有人说“做一个 H5”时,对方指的往往是一个在微信朋友圈传播的精美幻灯片,或者是一个简单的营销小游戏。然而,当你打…

作者头像 李华
网站建设 2026/1/27 8:33:15

3-VueAjax

什么是Vue Vue是一款用于构建用户界面的渐进式的JavaScript框架。官方网站:https://cn.vuejs.org/ 前端负责将数据以美观的样式呈现出来,而数据最终又要在数据库服务器中存储并管理。前端想要拿到数据,就需要请求服务器。然后服务器将数据返…

作者头像 李华
网站建设 2026/1/27 7:06:58

基于springBoot的房屋租赁管理系统

房屋租赁管理系统的背景意义 市场需求驱动 随着城市化进程加快,流动人口增多,房屋租赁需求持续增长。传统租赁方式依赖中介或线下沟通,效率低且信息不透明。数字化管理系统能优化流程,提升供需匹配效率,降低交易成本…

作者头像 李华
网站建设 2026/1/27 10:03:55

Java基于SSM+JSP的智慧农业无人机租赁系统的设计与实现

项目说明 农业无人机是一种在现代农业中广泛应用的无人机设备,它可以通过遥控或自主飞行,进行一系列农业作业。这些无人机通常配备有高分辨率相机和绘图设备,可以用于进行土地勘测、作物评估、农药喷洒等农业活动。无人机在农业领域的应用&am…

作者头像 李华