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;
}
相关推荐
ambition2024210 分钟前
从暴力搜索到理论最优:一道任务调度问题的完整算法演进历程
c语言·数据结构·c++·算法·贪心算法·深度优先
cmpxr_12 分钟前
【C】原码和补码以及环形坐标取模算法
c语言·开发语言·算法
qiqsevenqiqiqiqi13 分钟前
前缀和差分
算法·图论
代码旅人ing22 分钟前
链表算法刷题指南
数据结构·算法·链表
2401_8274999925 分钟前
python项目实战09-AI智能伴侣(ai_partner_5-6)
开发语言·python
kebeiovo26 分钟前
atomic原子操作实现无锁队列
服务器·c++
PD我是你的真爱粉27 分钟前
MCP 协议详解:从架构、工作流到 Python 技术栈落地
开发语言·python·架构
Yungoal27 分钟前
常见 时间复杂度计算
c++·算法
6Hzlia34 分钟前
【Hot 100 刷题计划】 LeetCode 48. 旋转图像 | C++ 矩阵变换题解
c++·leetcode·矩阵
星晨雪海1 小时前
基于 @Resource 的支付 Service 多实现类完整示例
java·开发语言