细说C语言【内存存储】

本文章分为:内存结构、大小端存储、不同数据类型的存储方式

内存结构

C语言中,对内存进行了划分。总共分为:栈区、堆区、代码区、常量区、全局数据区。
其中全局数据又可细分为:初始化静态数据区和未初始化静态数据区

栈区

  • 存放函数执行时的局部变量、函数参数和函数返回值
  • 栈区的大小由操作系统决定
  • 函数之间的调用是通过栈实现的,调用函数就入栈,函数执行完就出栈
  • 栈区的数据由编译器自动分配和释放内存
  • 栈区按地址由高到低生长。新分配的栈内存地址会比之前的低
  • 栈区的操作非常高效、速度快,因为在栈空间的分配和释放只涉及移动栈指针

堆区

  • 堆区是动态内存分配的区域,可以在程序中使用malloc、free进行申请和释放内存空间。在申请的内存区域使用完成后要及时释放,如果不能很好的控制内存使用,会造成内存泄露的风险。
  • 在栈区另外的一个不同点,堆区申请的空间没有大小限制,大小由系统内存或虚拟内存上限决定
  • 堆区的内存分配和释放通常比较慢,由于堆区还会涉及到内存碎片的整理,这些都会影响到内存的分配和释放性能
  • 堆区的内存地址通常是从低地址向高地址方向增长的

代码区

存放要执行的二进制代码(编译后生成的),这部分是只读的

代码区是共享的,多个进行共享同一份代码

常量区

  • 存放字符串常量(由指针方式创建的字符串,使用数据方式初始化的字符串不会存放在这里)
  • 存放const修饰的全局变量
  • 常量区存储内容固定,一般在编译时就已经确认

全局数据区

  • 存放全局变量和静态变量(由static修饰的变量)【所以static会延长局部变量的生存周期】,这些数据只有在程序运行完成后才会销毁
  • 全局变量可以在程序的任何地方访问,局部静态变量只能在声明它的函数内访问,但是函数调用后静态变量仍然存在,它的内存空间不会释放

大小端存储:

大小端存储时数据在内存存储的两种不同形式,主要涉及多字节数据类型的字节排列顺序

大端存储

数据的高地址存放在内存的低地址;数据的低地址字节存放在高地址

与人通常的书写方式相同

小端存储

数据的低字节存储在内存的低地址处,而高字节存储在高地址处

小端存储是目前处理器采用的存储方式;因为现代处理器都是以字节为单位获取数据,且经常处理最低有效字节,因此小端存储可以使不考虑符号比大小等类型的运算更加高效

大端优势在于符合人类的阅读习惯;小端优势在于其效率,在处理字节序列时不需要进行额外的转换操作

C语言浮点存储

浮点存储,遵循国际标准IEEE(电⽓和电⼦⼯程协会)754;二进制浮点数的表现形式

这也证明了浮点数用二进制表示会出现误差

浮点数的存储,就是存储S,M,E相关的值

在国际标准IEEE中规定,32位的浮点数(float),最高1位时存储符号S,接下来8位是存储整数E,剩下的23位用于存储有效数字M

在国际标准IEEE中规定,64位的浮点数(double),最高1位时存储符号S,接下来11位是存储整数E,剩下的52位用于存储有效数字M

负数存储方式

在知道存储方式之前,首先要明白,负数如何用二进制表示

正数的存储方式,就是存储其的二进制格式;那么负数也应是存储其的二进制格式

原码、补码、反码

  • 原码:其数据的二进制数字
  • 反码:反码需要通过原码来计算
    • 非负整数反码
      反码 = 原码
    • 负数整数反码
      符号位不变,其余的位按位取反
  • 补码:通过反码计算补码
    • 非负整数补码
      原码 = 反码 = 补码
    • 负整数补码
      补码 = 反码+1

负数的存储

计算负数的二进制过程如下:

  • 负数的绝对值转为二进制
  • 将绝对值的二进制按位取反
  • 按位取反后的结果加1

一共三个步骤

注意负数的二进制并不是其补码

如果您觉得这篇文章不错,且手里较为宽裕,可以支持一下博主,一分也是缘分😊
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇