重生到现代之从零开始的C语言生活》—— 内存的存储

数据在内存中的储存

整数在内存中的储存

我们知道整数的二进制的表示方法有三种,就是原码,反码和补码

有符号的整数,有符号位和数值位两种部分,符号位的0表示正数,1表示负数,最高一位是符号位,其他是数值位

正整数的原码反码补码都相同,负整数的都不同,从原码转到补码就是按位取反+1

整数在内存中存放的都是补码

大小端字节序和字节序的判断

大端存储模式:

是指数据的低位字节内容保存在高地址处,就是低位字节高位存放

小端存储模式:

是指数据的低位字节内容保存在低地址处,就是低位字节低位存放

字节一般是从左往右依次递减,比如0x2233 , 0x22就是高字节,0x33就是低字节

地址是从左往右依次递增

所以如果从内存上看,小端模式的内存存储和字节刚好是倒序

浮点数的存储

浮点数的存储和整数的存储差别巨大,就导致如果是整数存储浮点数的形式读取的话就会有很大差别

那么浮点数是怎么存储和读取的呢

根据国际标准IEEE(电⽓和电⼦⼯程协会) 754,任意⼀个⼆进制浮点数V可以表⽰成下⾯的形式:

V = (−1) ∗ S M ∗ 2E • (−1)

S 表⽰符号位,当S=0,V为正数;当S=1,V为负数

M 表⽰有效数字,M是⼤于等于1,⼩于2的

2E 表⽰指数位

举例来说比较深刻,假如是十进制的5.0,那二进制就是101.0,科学计数法就是1.01*2的2次方(2的2次方,2的一次方小数点左边2的负一次方,2的负二次方)

这就是浮点数不能做精准运算的原因,是因为有些浮点数不能完全转化为二进制

那么首先,他是正数,S=0

M作为有效数字=1.01

E=2

而IEEE 754规定:

对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M

对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M

IEEE 754 对有效数字M和指数E,还有⼀些特别规定。

因为M是⼤于等于1,⼩于2的 ,所以M可以写成1.xxxxxxxx,IEEE 754 规定,在计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,只保存后⾯的xxxxxx部分

而对于指数E,因为指数E可能出现负数,所以所以IEEE 754规定,存⼊内存时E的真实值必须再加上 ⼀个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。

浮点数的取出

E的取出有三种情况

  • E有0有1,就按正常程序
  • E全是0,是一个接近0很小的数字
  • E全是1,是一个无穷大的数字
相关推荐
cen__y38 分钟前
Linux12(Git01)
linux·运维·服务器·c语言·开发语言·git
AI人工智能+电脑小能手42 分钟前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
社交怪人1 小时前
【算平均分】信息学奥赛一本通C语言解法(题号2071)
c语言·开发语言
郭涤生2 小时前
不同主机之间网络通信-以太网连接复习
开发语言·rk3588
山居秋暝LS2 小时前
【无标题】RTX00安装paddle OCR,win11不能装最新的,也不能用GPU
开发语言·r语言
卢锡荣2 小时前
单芯通吃,盲插标杆 —— 乐得瑞 LDR6020,Type‑C 全场景互联 “智慧芯”
c语言·开发语言·计算机外设
Xin_ye100862 小时前
C# 零基础到精通教程 - 第七章:面向对象编程(入门)——类与对象
开发语言·c#
AI科技星3 小时前
《数学公理体系·第三部·数术几何》(2026 年版)
c语言·开发语言·线性代数·算法·矩阵·量子计算·agi
审判长烧鸡3 小时前
【Go工具】go-playground是什么组织?官方的?
开发语言·安全·go
kkeeper~3 小时前
0基础C语言积跬步之字符函数与字符串函数(上)
c语言·开发语言