C语言整型数据的存储(持续更新)

本文介绍了C语言中整型数据的不同类型及其内存占用,强调了原码、反码和补码的概念。补码的使用确保了CPU在进行负数加法时能得到正确结果,通过一个32位的示例解释了补码运算的过程。

 

一.整型家族

 在C语言中,整型数据有short,int,long,long long和char,这一系列整型是以二进制的方式存放在内存中的,不同的整型表示占用的内存大小不同,因此可以存储的数据大小也不同。

二.原码,反码,补码的概念

 原码直接把数据翻译成二进制,反码是原码符号位即首位不变,其它位相反,补码是在反码的基础上加一,正数的原码,反码和补码都是一样的。而数据在内存中都是以补码的形式存储的,这是因为CPU下面只可以进行加法运算

举一个例子来说明:

1-1=0,在CPU中会翻译成1+(-1),然后将补码相加,最后翻译成十进制得出答案,具体过程如下(以32字节为例)

00000000000000000000000000000001 1的补码

11111111111111111111111111111111 -1的补码

两者相加得到 100000000000000000000000000000000 结果为0,如果用原码,最后会得到-2,不是正确的答案。所以说,补码的出现完美解决了这一问题。

 

### C语言数据存储形式 #### 静态与动态存储类别 在C语言里,变量依据其声明方式被划分为两种主要的存储类别:静态存储和动态存储。对于采用静态存储方式的变量,在编译期间即完成内存空间预留工作,并且在整个应用程序执行周期内持续占用这部分资源,这意味着这类变量拥有固定的内存位置[^1]。 相反地,那些遵循动态存储机制的对象会在程序实际运行时才获取必要的内存单元,它们的存在期限依赖于具体的调用场景或是作用域范围内的活动状态变化而定。 #### 实型变量内部表示法 针对实数类型的处理上,C语言提供了`float`单精度浮点数以及`double`双精度浮点数两种选项。这些数值按照IEEE754标准来编码保存,具体来说由三部分组成:符号位(sign bit)、指数偏移值(exponent bias value)和尾数(mantissa),这使得计算机能够有效地表达非常大或极小的小数[^2]。 #### 整形常量及其补码表现形式 当涉及到负整数如`b=-10`这样的赋值操作时,系统会利用二进制补码体系来进行记录。该例子展示了如何通过原码、反码最终形成补码的过程,其中每一个步骤都反映了不同层面的信息压缩策略以适应硬件底层需求[^3]: ```c #include<stdio.h> int main(){ int b = -10; } ``` 在此基础上,可以看到`-10`对应的机器级描述如下所示: - **原码**: `10000000000000000000000000001010` - **反码**: `11111111111111111111111111110101` - **补码**: `11111111111111111111111111110110` #### 结构体成员排列规则 除了基本的数据类型外,复合结构也是构成复杂应用不可或缺的一部分。例如定义了一个名为`Stu`的学生信息模板,它包含了年龄(`age`)字段和姓名数组(`name[20]`)。值得注意的是,为了提高访问效率并满足特定平台的要求,编译器可能会调整各组成部分之间的相对距离,这就是所谓的“内存对齐”,从而影响到整体对象所占据的实际字节数目[^4]。 #### 扩容转换原则概述 最后提到的一点是关于不同类型间相互转化的原则之一——扩容转换。这种做法旨在确保参与算术运算的不同宽度的操作数之间不会因为尺寸差异而导致计算结果失真或者丢失有效数字。比如当遇到`int`与`long`混合运算的情况时,前者会被临时提升至后者规格再继续后续流程[^5]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ke vin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值