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;
}
相关推荐
我不会写代码njdjnssj1 小时前
贪心算法+动态规划
算法·贪心算法·动态规划
Unstoppable221 小时前
代码随想录算法训练营第 55 天 | 53. 寻宝(Prim + Kruskal)
数据结构·算法··kruskal·prim
橘颂TA1 小时前
【剑斩OFFER】算法的暴力美学——数青蛙
算法·leetcode·动态规划·结构与算法
渡我白衣1 小时前
并行的野心与现实——彻底拆解 C++ 标准并行算法(<execution>)的模型、陷阱与性能真相
java·开发语言·网络·c++·人工智能·windows·vscode
m0_639397291 小时前
代码随想录算法训练营第三十九天|198.打家劫舍,213.打家劫舍II,337.打家劫舍III
算法
heisd_11 小时前
KNN 算法和 K means算法和 Q-Learning 算法(简单的理解)
算法
bigdata-rookie1 小时前
Scala 泛型
开发语言·后端·scala
闻缺陷则喜何志丹1 小时前
【几何】二维矢量叉乘、正弦定理、三维叉乘及鞋带公式(高斯面积公式)
c++·数学·正弦定理·鞋带公式·矢量叉乘·简单多边形面积
liu****1 小时前
15.自定义类型:联合和枚举
数据结构·c++·剪枝