【计算机组成原理】数据在内存中的存储问题

        大家好😃,我是想要慢慢变得优秀的向阳🌞同学👨‍💻,从今天开始逐渐恢复更新状态,想学习计算机知识的小伙伴可以支持一下哦!~不能说肯定是干货,但会让你有所收获!💓💓💓

🍭🍭快乐地生活在这个世界上,你不需要取悦于任何人,做最好的自己。🍭🍭

目录

🎹🎹整形在内存中的存储🎹🎹

☎️☎️原码、反码、补码☎️☎️

🖥️🖥️大小端介绍🖥️🖥️

⌨️⌨️相关习题练习及其讲解⌨️⌨️

📷📷第一道📷📷

🕯️🕯️第二道🕯️🕯️

🎬🎬第三道🎬🎬

🪔🪔第四道🪔🪔


今天我们讲的例子以c语言为载体,便于读者更好的理解。

🎹🎹整形在内存中的存储🎹🎹

在c语言中,整型家族有

       我们知道一个变量在创建的时候会开辟一块内存空间来储存它对应的值,内存开辟的空间大小取决于变量的类型,那么内存会如何储存这些整型变量的呢?


☎️☎️原码、反码、补码☎️☎️

在我们具体讲解前,先了解一下系统储存整型的三个形式,原码,反码及其补码。

三种表示方法均有符号位数值位两部分,符号位都是用0表示,用1表示

正整数:原码,反码及其补码

负整数:遵循上面的计算规律。

正负数运算或者储存,都是以补码的形式进行的!

 具体例子


 那么为什么呢?

      因为计算机cpu只有加法运算,其他运算都是模拟出来的,而补码的存在就是为了保证运算的准确性,如果你用原码进行计算那么上面运算答案将是错误的。


🖥️🖥️大小端介绍🖥️🖥️

让我们来再看看


经过上面的图对比,我们发现整型在内存中储存数值的十六进制时,是倒着储存的!

 在解释答案之前,我们先了解一下大小端字节序

 那么为什么存在大小端字节序呢?

       因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8比特,对于char类型一块内存就可以储存了,但还有int,short这些大于一个字节的类型,所以储存时必然存在数值前后存放顺序的问题,这种问题导致出现了不同的储存顺序的方法!


⌨️⌨️相关习题练习及其讲解⌨️⌨️

      下面的习题中会存在,整型提升的问题,如果对整型提升语法有疑问的小伙伴可以点击学习一下【表达式求值】整型提升和算术转换问题_想要慢慢变得优秀的向阳的博客-CSDN博客


📷📷第一道📷📷

#include<stdio.h>
int check_sys()
{
	int a = 1;
	return *(char*)&a;
}

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

	//00000000000000000000000000000001
	//0x 00 00 00 01
	//

	return 0;
}

        为了便于运算我们直接创建一个临时变量为1的值,并且用char*的指针解引用走一步(只解引用内存储存的数值前面的一个字节)如果是小端则返回值为01,大端则为00,再用if判断输出结果。


🕯️🕯️第二道🕯️🕯️

//输出什么?
#include <stdio.h>
int main()
{
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("a=%d,b=%d,c=%d", a, b, c);
	return 0;
}

 这里我们会用到整型提升,因为变量类型都是char类型,而输出要求为整型类型,需要进行整型提升。

下面是对a的过程解析,b同理。

 下面是对c的过程解析


🎬🎬第三道🎬🎬

//求a,b输出值
#include<stdio.h>
int main()
{
	char a = -128;
	char b = 128;
	printf("%u %d", a, b);


	return 0;
}

这道题注意有符号char类型的范围,其他方法与上面相同。


🪔🪔第四道🪔🪔

#include<stdio.h>
int main()
{
	int i = -20;
	unsigned int j = 10;
	printf("%d\n", i + j);
	//按照补码的形式进行运算,最后格式化成为有符号整数

	return 0;
}

      这里只用注意到,将整数放入int类型不需要截断,而且两个数的运算是通过补码进行的,如果运算后的补码为正,则原反补一样,输出结果直接就出来了,如果补码为负,则需要转换为原码,将原码值输出。

评论 113
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

想要慢慢变得优秀的向阳同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值