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

2022-09-19 11:36:30

在C语言中,我们学习了各种数据类型以及其所占的存储空间大小

int--4个字节

float--4个字节

char--1个字节

double--8个字节

long--4个字节

指针类型由编译器决定--32位编译器占4字节;64位编译器占8字节。

一、整形存储

我们知道整形数据会分配四个字节的空间,那整形在内存中究竟是如何存储的呢?

我们需要先了解以下内容:

1、原码、反码、补码

原码--一个数字直接转换而成的二进制

反码--符号位不变,数值位取反

补码--反码+1

在计算机中,数据的运算都是以数据的补码进行的

【注】正数与无符号数据的原反补都是一样的,与原码相同。

2、大小端

2.1、字节序

概念:CPU对内存中的数据以字节为单位进行存取的顺序(因为内存有高低地址之分,数据的二进制有高低位之分)

针对的数据类型:存储单元大于一个字节的数据类型

主机字节序主要取决于CPU架构---我们常用的x86是小端模式

分类:大端--低地址存高位

小端--低地址存低位

下面来看一个实际案例

#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;
}

最终结果为

有符号数就是用最高位表示符号(正或负),其余位表示数值大小,无符号数则所有位都用于表示数的大小

 二、浮点型在内存中的存储

1、小数转换成二进制:乘2取整法

2、小数在内存中存储是以浮点形式存储

因为指数位的数值有可能出现负数,但是指数域是无符号的,无法表示负数。

采用指数基数:127,真正指数位存储的数据是实际指数值+127。

专业说法叫做使用数字的移码﹣1;移码:正数的移码就是符号位取反因为浮点存储在进行浮点移动的时候,总会移动到第一个1的后边,因此所有数字的表示都是:1.xxxx

采用这种方式之后,因为尾数部分,第一个比特位总是存储1,如果把这个1忽略掉,采用这种规则,用的时候再给加上,1就不用存储了,就节省了一个比特位 。

 两种特殊情况:

E为全0:这时真实指数值是1-127=-126,M表示真实值,通常用于表示正负0

E为全1:这时真实指数值是255-127=128,M为全0时表示正负无穷大

【注】32位下:S-占1个比特位;E-占8个比特位;M占23个比特位

           64位下:S-占1个比特位;E-占11个比特位;M占52个比特位

  • 作者:阿逆
  • 原文链接:https://blog.csdn.net/m0_63617653/article/details/125092672
    更新时间:2022-09-19 11:36:30