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;
}
相关推荐
PPPPPaPeR.42 分钟前
光学算法实战:深度解析镜片厚度对前后表面折射/反射的影响(纯Python实现)
开发语言·python·数码相机·算法
橙露1 小时前
Java并发编程进阶:线程池原理、参数配置与死锁避免实战
java·开发语言
froginwe111 小时前
C 标准库 - `<float.h>`
开发语言
看我干嘛!1 小时前
python第五次作业
算法
历程里程碑1 小时前
Linux 库
java·linux·运维·服务器·数据结构·c++·算法
Sheep Shaun1 小时前
如何让一个进程诞生、工作、终止并等待回收?——探索Linux进程控制与Shell的诞生
linux·服务器·数据结构·c++·算法·shell·进程控制
Pluchon1 小时前
硅基计划4.0 简单模拟实现AVL树&红黑树
java·数据结构·算法
2501_916008891 小时前
深入解析iOS机审4.3原理与混淆实战方法
android·java·开发语言·ios·小程序·uni-app·iphone
生锈的键盘1 小时前
推荐算法实践:交叉特征的理解
算法
小龙报1 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机