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

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

  • 本章重点
  • 数据类型详细介绍
    • 数据类型介绍
    • 类型的基本归类
      • 整形家族
      • 浮点数家族
      • 构造类型
      • 指针类型
      • 空类型
  • 整形在内存中的存储
  • 大小端介绍
    • 引例
    • 什么是大端小端
    • 练习
  • 练习

本章重点

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
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,得到的就是补码

深度剖析数据在内存中的存储(一)_第1张图片
整数在内存中存储的是补码
为什么不是原码呢?!
深度剖析数据在内存中的存储(一)_第2张图片

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

大小端介绍

引例

深度剖析数据在内存中的存储(一)_第4张图片
深度剖析数据在内存中的存储(一)_第5张图片
发现在当前编译器底下,这些补码都是倒着存储的

什么是大端小端

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

练习

请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。
第一问如上(定义)
深度剖析数据在内存中的存储(一)_第6张图片
优化:

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

结果
深度剖析数据在内存中的存储(一)_第7张图片
解析
深度剖析数据在内存中的存储(一)_第8张图片
2.
题目

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

结果
深度剖析数据在内存中的存储(一)_第9张图片
解析
深度剖析数据在内存中的存储(一)_第10张图片
3.`
题目

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

结果
深度剖析数据在内存中的存储(一)_第11张图片
解析
深度剖析数据在内存中的存储(一)_第12张图片
4.
题目

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

结果
深度剖析数据在内存中的存储(一)_第13张图片
解析
深度剖析数据在内存中的存储(一)_第14张图片
5.
题目

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

结果
深度剖析数据在内存中的存储(一)_第15张图片

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

题目

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

结果
深度剖析数据在内存中的存储(一)_第16张图片
解析
深度剖析数据在内存中的存储(一)_第17张图片
补充
深度剖析数据在内存中的存储(一)_第18张图片
7.
题目

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

结果
深度剖析数据在内存中的存储(一)_第19张图片
死循环
解析

深度剖析数据在内存中的存储(一)_第20张图片

深度剖析数据在内存中的存储(一)_第21张图片
当i=256(i最大为255)是会把i转化为0(i为unsigned char类型)从而进行死循环。

待续…

你可能感兴趣的:(编程语言,C语言,C++,c++,编程语言,c语言)