深度剖析数据在内存中的存储(一)

30 篇文章 0 订阅
9 篇文章 0 订阅
本文深入探讨了数据在内存中的存储方式,包括数据类型的详细分类,如整形家族、浮点数家族、构造类型等。重点讲述了整型在内存中以补码形式存储的原因,并介绍了大小端字节序的概念,提供了判断机器字节序的小程序。此外,还通过实例分析了不同数据类型的输出表现。
摘要由CSDN通过智能技术生成

本章重点

1.数据类型详细介绍
2.整形在内存中的存储:原码、反码、补码
3.大小端字节介绍及判断
4.练习

数据类型详细介绍

数据类型介绍

基本的内置类型:
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点型
double //双精度浮点型
类型的意义:
1.使用这个类型开辟内存空间的大小(大小决定了使用的范围)
2.如何看待内存空间的视角

类型的基本归类

整形家族

表示范围:limits.h
char
unsigned char
signed char
short
unsigned short
signed short
int
unsigned int
signed int
long
unsigned long
signed long
注意:char类型存储的是ASCII值因此归为整形

浮点数家族

表示范围:float.h
float
double

构造类型

数组类型

#include<stdio.h>
int main()
{
	int arr[10];  // int [10]  这就是一种类型
	int arr2[5];   //int [5]     另一种类型
	return 0;
}

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

指针类型

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

空类型

void 表示空类型(无类型)
通常应用于函数的返回类型 void test()
函数的参数 void test(void)
指针类型 void *pv

整形在内存中的存储

数据在内存中以2进制的形式存储
对于整数来说
整数的二进制有三种表示形式:原码、反码、补码
正整数:原码、反码、补码相同
负整数:原码、反码、补码不同,补码要进行计算的

三种表示方法均有三种符号位和数值为两部分,符号位都是用0表示的正,用1表示负,而数值位三种表示方法个不相同
按照数据的数值直接写出的二进制序列就是原码
原码的符号位不变,其他位按位取反,得到的就是反码
反码+1,得到的就是补码

在这里插入图片描述
整数在内存中存储的是补码
为什么不是原码呢?!
在这里插入图片描述

在这里插入图片描述
在计算机中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的(即取反,在+1),不需要额外的硬件电路。

大小端介绍

引例

在这里插入图片描述
在这里插入图片描述
发现在当前编译器底下,这些补码都是倒着存储的

什么是大端小端

大端(存储)模式(大端字节序),是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。
小端(存储)模式(小端字节序),是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中。

练习

请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。
第一问如上(定义)
在这里插入图片描述
优化:

int check_sys()
{
	int a = 1;
	return *(char*)&a;//返回1表示小段,返回0表示大段
}
int main()
{
	int ret = check_sys();
	if (ret == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

练习

题目

//输出的是什么
#include<stdio.h>
int main()
{
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("a=%d\nb=%d\nc=%d\n", a, b, c);
	return 0;
}

结果
在这里插入图片描述
解析
在这里插入图片描述
2.
题目

#include<stdio.h>
int main()
{
	char a = -128;
	printf("%u\n", a);
	return 0;
}

结果
在这里插入图片描述
解析
在这里插入图片描述
3.`
题目

#include<stdio.h>
int main()
{
	char a = 128;
	printf("%u\n", a);
	return 0;
}

结果
在这里插入图片描述
解析
在这里插入图片描述
4.
题目

#include<stdio.h>
int main()
{
	int i = -20;
	unsigned int j = 10;
	printf("%d\n", i + j);
	return 0;
}

结果
在这里插入图片描述
解析
在这里插入图片描述
5.
题目

#include<stdio.h>
int main()
{
	unsigned int i;
	for (i = 9;i >= 0;i--)
	{
		printf("%u\n", i);
	}
	return 0;
}

结果
在这里插入图片描述

死循环
解析
因为当i为负数时会将i转化为较大的正整数(因为i为unsigned int类型)

题目

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
	char a[1000];
	int i;
	for (i = 0;i < 1000;i++)
	{
		a[i] = -1 - i;
	}
	printf("%d", strlen(a));
	return 0;
}

结果
在这里插入图片描述
解析
在这里插入图片描述
补充
在这里插入图片描述
7.
题目

#include<stdio.h>
unsigned char i=0;
int main()
{
	
	for (i = 0;i <=255;i++)
	{
		printf("hello world\n");
	}
	return 0;
}

结果
在这里插入图片描述
死循环
解析

在这里插入图片描述

在这里插入图片描述
当i=256(i最大为255)是会把i转化为0(i为unsigned char类型)从而进行死循环。

待续…

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值