13.数据在内存中的存储

一.整数在内存中的存储

二.大小端字节序和字节序判断

cpp 复制代码
int main()
{
	int a = 10;//0x 00 00 00 0a
	int b = 0x11223344;

	return 0;
}

1.检测大小端代码

cpp 复制代码
//写一个代码,来判断当前机器是大端还是小端?

int main()
{
	int a = 1;
	char* p = (char*)& a;
	if (*p == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}

	return 0;
}

int main()
{
	int a = 1;
	if (*(char*)&a == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}

	return 0;
}



int check_sys()
{
	int a = 1;
	//1. 取出a的地址
	//2. 强制类型转换成char*后解引用,只取a的第一个字节的数据
	//3. 如果取出是1,就是小端,取出是0就是大端
	return *(char*)&a;
}

int main()
{
	int ret = check_sys();
	if (ret == 1)
		printf("小端\n");
	else
		printf("大端\n");

	return 0;
}

2.练习二

cpp 复制代码
#include <stdio.h>

int main()
{
   char a = -1;
   //10000000000000000000000000000001
   //11111111111111111111111111111110
   //11111111111111111111111111111111
   //存储在a中要发生截断
   //11111111 - a
   //11111111111111111111111111111111
   //10000000000000000000000000000000
   //10000000000000000000000000000001
   //
   signed char b = -1;
   //11111111 - b
   //
   unsigned char c = -1;
   //11111111 - c
   //00000000000000000000000011111111
   //
   printf("a=%d,b=%d,c=%d", a, b, c);
   //-1 -1 255
   //%d - 十进制的形式打印有符号的整数
   //
   return 0;
}

整型提升按照我们的有无符号位进行提升

3.练习三

cpp 复制代码
#include <stdio.h>

int main()
{
   char a = -128;
   //10000000000000000000000010000000
   //11111111111111111111111101111111
   //11111111111111111111111110000000
   //10000000 - a
   //打印时发生整型提升
   //11111111111111111111111110000000
   //
   printf("%u\n", a);//4,294,967,168
   //%u 是十进制的形式打印无符号的整数
   //
   return 0;
}
cpp 复制代码
#include <stdio.h>
int main()
{
   char a = 128;
   //00000000000000000000000010000000
   //10000000 - a
   //
   printf("%u\n", a);
   return 0;
}

这个结果和上面的是一样的

4.练习四

cpp 复制代码
int main()
{
   char a[1000];
   //-128~127
   //-1 -2 -3 ... -128 127 126 125 ... 5 4 3 2 1 0 -1 -2 ... -128 127 126 ... 5 4 3 2 1 
   //128+127 = 255
   int i;
   for (i = 0; i < 1000; i++)
   {
       a[i] = -1 - i;
   }
   printf("%d", strlen(a));//求字符串长度找的是\0,\0的ASCII码值是0,其实找的就是0
   //255
   return 0;
}

5.练习五

cpp 复制代码
#include <stdio.h>

unsigned char i = 0;
//0~255

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

会死循环,这里unsigned char 最大255

6.练习六

cpp 复制代码
#include <stdio.h>
#include <windows.h>

int main()
{
   unsigned int i;
   //死循环
   for (i = 9; i >= 0; i--)
   {
       printf("%u\n", i);
       Sleep(1000);//睡眠1秒
   }

   return 0;
}

和上面是一样的,也会死循环

7.练习七

cpp 复制代码
#include <stdio.h>

int main()
{
   int a[4] = { 1, 2, 3, 4 };
   int* ptr1 = (int*)(&a + 1);
   int* ptr2 = (int*)((int)a + 1);
   printf("%x,%x", ptr1[-1], *ptr2);
   return 0;
}

%x是以16进制进行打印

三.浮点数在内存中的存储

1.练习

cpp 复制代码
#include <stdio.h>

int main()
{
   int n = 9;
   float* pFloat = (float*)&n;//int*

   printf("n的值为: %d\n", n);
   printf("*pFloat的值为: %f\n", *pFloat);

   *pFloat = 9.0;
   printf("num的值为: %d\n", n);
   printf("*pFloat的值为: %f\n", *pFloat);
   return 0;
}

2.浮点数的存储

cpp 复制代码
10:       5.5
2:        101.1
科学计数法:1.011 * 2^2
         (-1)^0 *1.011 *2^2
S = 0
E = 2
M = 1.011

回到刚刚那个题目

cpp 复制代码
#include <stdio.h>

int main()
{
   int n = 9;
   float* pFloat = (float*)&n;//int*

   printf("n的值为: %d\n", n);
   printf("*pFloat的值为: %f\n", *pFloat);

   *pFloat = 9.0;
   printf("num的值为: %d\n", n);
   printf("*pFloat的值为: %f\n", *pFloat);
   return 0;
}
cpp 复制代码
int main()
{
	float f = 99.7f;
	printf("%f\n", f);
	return 0;
}
相关推荐
灵感__idea11 小时前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
Wect21 小时前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP1 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
端平入洛2 天前
delete又未完全delete
c++
颜酱2 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub2 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉
CoovallyAIHub2 天前
YOLO-IOD深度解析:打破实时增量目标检测的三重知识冲突
深度学习·算法·计算机视觉