C语言:整形数据在内存中的存储

在了解数据在内存中的存储时,先了解数据的类型有哪些,以及这些类型的基本归类,以下是整理的相关内容。

数据类型

char 字符数据类型
short 短整型
int 整型
long 长整型
long long 更长的整型
float 单精度浮点数
double 双精度浮点数

类型的意义:
1.开辟了内存空间的大小(大小决定了范围)
2.决定了访问内存空间的方式

注:C语言中没有字符串类型
整形类型

char
unsigned char
signed char
short
unsigned short
signed short
int
unsigned int
signed int
long
unsigned long
signed long

浮点数类型

float
double

构造类型

数组类型
结构体类型 struct
枚举类型 enum
联合类型 union

指针类型

int *pi;
char *pc;
float *pf;
void *pv;

空类型

void表示空类型(无类型)

void通常用于函数的返回类型,函数的参数,指针类型
注:void可以接受任何指针类型,但void不能用来定义变量,因为void的大小不能确定,不能决定开辟多少个字节的空间
但void *可以定义变量,其在32位平台下占四个字节(void *是指针,其大小是确定的)

整型在内存中的存储

要想了解整型在内存中的存储,需要先了解以下概念:
计算机中的有符号数有三种表示方法:原码、反码、补码
三种表示方法分为有符号位数值位两部分,
符号位用0表示正,1表示负(无符号数不需要用符号位表示)
而数值位三种表示方法都不相同
原码
将二进制按照正负数的形式变为二进制
反码
将原码的符号位不变,其他位按位取反
补码
补码=反码+1

注:正数的原、反、补码都相同
对于整型数据来说,数据内存中存放的其实是补码(计算机系统表示和存储数值时一律采用补码表示,原因在于使用补码,可以将符号位和数值域统一处理;同时,加法和减法可以进行统一的处理,在CPU中只有加法器;补码与原码之间的相互转换不需要额外的硬件电路,它们间的运算过程是相同的,都是取反后+1)

C语言:整形数据在内存中的存储_第1张图片
取值范围

有符号char类型的取值范围 -128~127 (-27 ~27-1)
有符号short类型的取值范围 -215 ~215-1
有符号int类型的取值范围 -231 ~231-1

C语言:整形数据在内存中的存储_第2张图片
关于char类型取值范围(-128~127)的说明:
char类型在存储时,一位表示符号位,剩下7位就可以表示(27)127个数字,即取值为0 ~ 127,但符号位分正负,则有(0 ~ 127)和(-127 ~ -0)而这个特殊的-0原码为1000 0000
在考虑取值范围时有两个特殊的序列 0后面全1(最大),1后面全0(最小)
-0和-128的比较:
C语言:整形数据在内存中的存储_第3张图片
有下面这样一段程序:

#include 

int main()
{
    char a = -129;
    printf("%d\n",a);
    return 0;
}

我们会发现输出的值是127
-129=-128-1;计算机只会计算加法所以这个式子转换为-128+(-1)
C语言:整形数据在内存中的存储_第4张图片

有符号char类型的最小值为-128 二进制序列为1000 0000(1后面有7个0)
有符号short类型的最小值二进制序列为 1后面有15个0
有符号int类型的最小值二进制序列为 1后面有31个0
即当我们遇到1后面跟全0的值时,理解为该类型的最小值
当遇到这些特殊的最小值时,不再遵循原反补之间的转换规则

存储数据的方法:
存数据时不看目标数据类型
读取时先检测查看目标类型,整型提升只看自身的类型(与其他无关)
无符号数永远大于等于0

在赋值时,将具体的一个常量赋给一个变量,不看它的类型,直接将数值转换成二进制序列,写入已经开辟的空间中
只有在取出这些数据时才会考虑类型的问题
C语言:整形数据在内存中的存储_第5张图片
将常数放入变量的步骤:

  1. 开辟空间(将常数转化成补码形式)
  2. 将补码写入空间
  3. 读取时有先看类型

C语言:整形数据在内存中的存储_第6张图片

大小端介绍

大端(存储模式):数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储模式):数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。

在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit,但除此之外还有16bit的short型等,寄存器在处理时会存在将多个字节安排的问题,所以导致了大小端的存储模式。

你可能感兴趣的:(C语言)