数据在内存中的存储,你get到了吗(芜湖~~)

本文详细解析了整形在内存中的存储原理,包括原码、反码和补码的概念,以及大小端字节序的区别。通过实例演示和技巧,帮助理解计算机如何存储和处理整数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(感谢各位大佬的点击,本人第一篇博客,后续会再接再厉的)

重点内容(先来瞅一瞅)

1.整形在内存中的存储:原码、反码、补码

2.大小端字节序介绍及判断

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGliLVN0cml2ZQ==,size_19,color_FFFFFF,t_70,g_se,x_16

1.整形在内存中的存储

一个变量本身的创建是要在内存中开辟空间的。空间的大小是根据本身类型决定的。

比如,大家都知道一个int类型的变量,自身被分配四个字节的空间。

但是其是如何在内存里面如何存储的?

下面我们来了解以下概念:

1.1原码、反码、补码

其内容简述,即计算机中的整数有三种表达方式,原码、反码、补码

此三种表达方式均有符号位数值位两部分的,符号位都是用0表示‘’,用1表示‘负’

数值位上,正整数其原,反,补码相同

负整数则有以下规律

原码

直接将二进制按照正负数的形式翻译成二进制就可以

反码

将原码的符号位不变,其他位依次按位取反即可

补码

在反码的基础末尾加一即可

 

对于整形来说:数据存放内存中其实存放的是补码。

为什么呢!!!

其原因在于,在计算机系统中,使用补码,可以将符号位和数值域统一处理:

同时,加法和减法也可以统一处理,CPU只有加法器,此外,补码和原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

下面代码展示

#include <stdio.h>

int main()
{
   int a=-10;
   int b=10;

   return 0;
}

eb9ba918d9394aa783c43bf505d24ace.png?x-oss-process=image,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGliLVN0cml2ZQ==,size_18,color_FFFFFF,t_70,g_se,x_16

7eafa07ccdd849e28d7844f0fbab212a.png?x-oss-process=image,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGliLVN0cml2ZQ==,size_18,color_FFFFFF,t_70,g_se,x_16

注:地址显示多以十六进制表示,其中越靠近0X 的 字节权值位越高,即数据的高位

de48267f98a04147bb3fafec80f93130.png?x-oss-process=image,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGliLVN0cml2ZQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 (0X表示该地址是以十六进制显示)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGliLVN0cml2ZQ==,size_8,color_FFFFFF,t_70,g_se,x_16watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGliLVN0cml2ZQ==,size_10,color_FFFFFF,t_70,g_se,x_16

 

 此时我们可以很容易的观察到,存储的是补码不假,但是为什么顺序却有些奇怪呢?

1.2 大小端的介绍

 什么是大小端呢?

大端存储模式,即是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;

小端存储模式,即是指数据的高位保存在内存的高地址中,而数据的低位,保存在内存的低地址中;(简称“小小小”,其中上述例子在VS2019环境下,便是小端存储显示)

补充:

字节序:CPU从内存中进行数据存储的顺序,以字节为单位;

主机的字节序取决与CPU架构;;例如X86--小端存储模式,MIPS--大端存储模式

 

 那么我们应当如何辨别是大端存储还是小段存储呢?

方式一:通过指针类型的强转,之后解引用,判断所取第一个字节内容

(补充:指针的类型,其实决定了指针从起始地址开始向后访问多少个字节;如char*,每次从起始地址访问一个字节单位)

void Endian()
{
	int tmp = 1;
	if (*(char*)(&tmp) == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
}
int  main()
{
	Endian();
	return 0;
}

方式二:利用联合体内存“共享”这一特性,在其内部元素起始地址相同,在通过不同类型,得知第一个字节内容(该方式实则为方式一的变形)

void Union()
{
	union
	{
		int m;
		char n;
	}un;
	un.m = 1;
	if (un.n == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
}
int  main()
{
	Union();
	return 0;
}

 

1.3 牛刀小试

练习一:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGliLVN0cml2ZQ==,size_20,color_FFFFFF,t_70,g_se,x_16

练习二:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAVGliLVN0cml2ZQ==,size_20,color_FFFFFF,t_70,g_se,x_16

 

 

 

 

这个错误是由于无法连接到本地主机的10248端口导致的。这个端口通常是kubelet进程监听的端口,用于健康检查。出现这个错误可能是由于kubelet进程没有正确启动或者配置错误导致的。 解决这个问题的方法是检查kubelet进程的状态和配置。你可以按照以下步骤进行操作: 1. 检查kubelet进程是否正在运行。你可以使用以下命令检查kubelet进程的状态: ```shell systemctl status kubelet ``` 如果kubelet进程没有运行,你可以使用以下命令启动它: ```shell systemctl start kubelet ``` 2. 检查kubelet的配置文件。你可以使用以下命令查看kubelet的配置文件路径: ```shell kubelet --kubeconfig /etc/kubernetes/kubelet.conf --config /var/lib/kubelet/config.yaml --bootstrap-kubeconfig /etc/kubernetes/bootstrap-kubelet.conf config view ``` 确保配置文件中的端口号和地址正确,并且与你的环境相匹配。 3. 检查网络连接。你可以使用以下命令检查是否可以连接到localhost10248端口: ```shell curl -sSL http://localhost:10248/healthz ``` 如果无法连接,请确保端口没有被防火墙或其他网络配置阻止。 4. 检查docker的配置。有时候,kubelet进程依赖于docker进程。你可以按照以下步骤检查docker的配置: - 创建/etc/docker目录: ```shell sudo mkdir /etc/docker ``` - 编辑/etc/docker/daemon.json文件,并添加以下内容: ```json { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2", "storage-opts": [ "overlay2.override_kernel_check=true" ], "registry-mirrors": ["https://tdhp06eh.mirror.aliyuncs.com"] } ``` - 重启docker进程: ```shell systemctl restart docker ``` 请注意,以上步骤是一种常见的解决方法,但具体解决方法可能因环境而异。如果以上步骤无法解决问题,请提供更多的错误信息和环境配置,以便我们能够更好地帮助你。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值