C语言数据在内存中的存储

文章目录

一、整形在内存中的存储

整形在内存中存储分为有符号和无符号,即signed int有符号整数,unsigned int无符号整数,int 在VS中是默认有符号的。

1、无符号整数。

存储无符号整数时,把整数转换为二进制的形式存储在内存中,当使用时直接取出来使用。

2、有符号整数。

在有符号整数中,把最高位当作符号位,0表示正数,1表示负数。

在存储时有符号整数引入了原码,反码,补码的概念。

正整数的原、反、补码都相同。

负整数的三种表示方法各不同。

原码:直接将负数最高位为1,值翻译成二进制形式。

反码:将原码除符号位外,按位取反。

补码:反码+1得到补码。

对于整形来说:数据存放内存中其实存放的是补码。

在计算机系统中,数值⼀律⽤补码来表⽰和存储。

原因在于,使⽤补码,可以将符号位和数值域统⼀处理;

同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是

相同的,不需要额外的硬件电路。

二、大小端字节序

计算机在内存中存储的数据分为大端存储和小端存储。

大端存储:数据的高字节内容保存在内存的低地址处,数据的低字节内容保存在高地址处。

小端存储:数据的高字节内容保存在内存的高地址处,数据的低字节内容保存在低地址处。

判断当前编译器是大小端字节序方法

c 复制代码
#include<stdio.h>
int judge_the_size()
{
	int a = 1;
	return *((char*)&a);
}
int main()
{
	if (judge_the_size())
	{
		printf("小端字节序\n");
	}
	else
	{
		printf("大端字节序\n");
	}
	return 0;
}

三、练习

练习1:
c 复制代码
#include <stdio.h>
int main()
{
 char a= -1;
 signed char b=-1;
 unsigned char c=-1;
 printf("a=%d,b=%d,c=%d",a,b,c);
 return 0;
}

char类型的取值范围为-128~127

a 和 b 在取值范围内类型相同,结果都为-1

c类型为无符号char类型,取值范围为0~255

-1给unsigned char 赋值

-1在内存中的存储补码为1111111

用%d打印时整形提升补0

结果255

练习2:
c 复制代码
#include <stdio.h>
int main()
{
	char a = -128;
	printf("%u\n", a);
	return 0;
}

char类型存储-128

在内存中的补码为1000000

在用%u打印整形提升时补1

11111111 11111111 11111111 10000000

结果为这个二进制的值


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

1、浮点数的存储

浮点数家族包括: float、double、long double 类型。

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

• (−1) s表⽰符号位,当S=0,V为正数;当S=1,V为负数

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

• 2 表⽰指数位

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

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

2、浮点数存的过程

在存时会把M转换成大于等于1,小于2的小数,移动小数位所以称为浮点数,对应E的值改变,存储M时只存储小数点后的数。

对指数E存储时E位8位时,加上中间值127然后存入内存中。

在E为11位时,加上中间值1023。

3、浮点数取的过程

分为三种情况:

(1)E不全为0或全为1

这时浮点是取的过程M加1,E如果在存时+127,取时就-127.

怎么存就反着取出来

(2)E全为0

这时,浮点数指数E的真实值等于1-127(或者1-1023),有效数M不再加1,直接还原为0.xxxxxxx的小数,这样为了表示±0,以及接近于0的很小的数字。

(3)E全为1

如果有效数M全为0,表示±无穷大


相关推荐
wuyk55512 小时前
104.C 语言字节对齐:从底层原理到工程实践的完整指南
c语言·开发语言·stm32·单片机·嵌入式硬件
南棱笑笑生18 小时前
20260904实测给飞凌OK3576-C开发板刷入Rockchip原厂的IMG固件【使用飞凌的DTS】切换串口波特率为1.5Mbps
c语言·开发语言·rockchip
2601_962295991 天前
嵌入式开发语言用哪个最好,C,python或者其他
c语言·python·嵌入式开发·开发效率·系统资源
是隼人1 天前
buuctf-pwn [HarekazeCTF2019]baby_rop2(64位ret2libc)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
wuyk5551 天前
107.FreeRTOS 链表深度解析:从原理到面试满分答案
c语言·开发语言·数据结构·stm32·单片机·链表·面试
AAA代码批发商1 天前
Days 39 Linux C 开发之 SQLite 数据库完整学习笔记
linux·c语言·数据库
卢锡荣1 天前
单芯掌控多口互联|乐得瑞 LDR6020 PD3.1 多通道 Type‑C 控制 SOC 芯片
c语言·开发语言
wuminyu1 天前
JVM锁膨胀与Futex源码解析
java·linux·c语言·jvm·c++
susplus1 天前
【HTTP协议】HTTP介绍及基础【C语言爬虫实现】
c语言·爬虫·http·万维网
xx~t1 天前
嵌入式——Linux软件编程——数据库
linux·c语言·数据库·oracle·sqlite