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

2022-09-19 12:45:15

创建任一数据类型都会在内存占用一块空间,其空间占用大小与数据类型有关。

//常见类型
char      //字符         占用1个字节,即8个bit,内存以二进制序列存储8位
short     //短整型           2         16                       16       
int       //整型             4         32                       32
float     //单精度浮点型      4         32                       32
double    //双精度浮点型      8         64                       64

了解到以上常见类型后,我们继续深入了解其归类:

unsigned(有符号)signed(无符号)

什么是有符号,什么是无符号?

该数据类型是有符号时,可以存储正负数;无符号,则存储正数(也可以存储负数,但)。

整型类:

char     //取决于编译器,大多数是有符号
     unsigned char 
     signed char
short    //默认有符号 等价于signed short 
     unsigned short 
     signed short    
int      //默认有符号 等价于signed int
     unsigned int
     signed int
long     //默认有符号 等价于signed long
     unsigned long 
     signed long

所以对于int, short, long而言,C语言规定默认为有符号,可以存储正负数;

char则需要根据编译器自身。

浮点类:

float, double, long double全都默认为有符号;

 整数在内存中以二进制序列存储

整数的二进制序列有三种表示方法,分别为原码,反码,补码;

在内存中,所有整数都以补码的形式存储在内存中;

对于正数原码,反码,补码都相同;

而对于负数,原码都是整数的二进制值;

反码则是对原码按位取反(~);

补码是在反码基础上+1;

举例说明:

int a = -10;
//原码: 10000000 00000000 00000000 00000100  可以看出原码就是整型的二进制值,
//同时int类型在内存中占据4个字节,1个字节8个bit位,所以是32位。
//反码: 11111111 11111111 11111111 11111011  反码则是对原码~(按位取反),
//符号位不变,其余0→1,1→0。
//补码: 11111111 11111111 11111111 11111100  补码=反码+1

除此以外,编译器为了方便观察,可以转为16进制位

2进制    1111 1111 1111 1111 1111 1111 1111 1100
16进制     f    f    f    f    f    f    f    6   ->ffffff6
#include<stdio.h>
int main()
{
	int a = -10;
	printf("%d\n", a);

	return 0;
}

 但可以发现内存中,是以f6 ff ff ff这样的方式存储的,为什么会这样?

这时我们要引入:大小端字节序存储。

了解大小端之前,我们需要先了解数据的高位低位。

对于一个数据:低位   0x11223344高位

从左到右,从低到高;

大端存储模式:        内存低地址   (高位) 0x44332211 (低位)   内存高地址

数据的高位存于内存低地址,而低位存于高地址;

小端存储模式:        内存低地址   (低位) 0x11223344 (高位)   内存高地址

数据的低位存于内存低地址,而高位存于高地址;

那么这就是数据的存储的基本内容了。

  • 作者:五烨逸
  • 原文链接:https://blog.csdn.net/qq_57561772/article/details/123816290
    更新时间:2022-09-19 12:45:15