大家好,我是想要慢慢变得优秀的向阳同学,从今天开始逐渐恢复更新状态,想学习计算机知识的小伙伴可以支持一下哦!~不能说肯定是干货,但会让你有所收获!
快乐地生活在这个世界上,你不需要取悦于任何人,做最好的自己。
目录
整形在内存中的存储
☎️☎️原码、反码、补码☎️☎️
️️大小端介绍️️
⌨️⌨️相关习题练习及其讲解⌨️⌨️
第一道
️️第二道️️
第三道
第四道
今天我们讲的例子以c语言为载体,便于读者更好的理解。
在c语言中,整型家族有
我们知道一个变量在创建的时候会开辟一块内存空间来储存它对应的值,内存开辟的空间大小取决于变量的类型,那么内存会如何储存这些整型变量的呢?
在我们具体讲解前,先了解一下系统储存整型的三个形式,原码,反码及其补码。
具体例子
那么为什么呢?
因为计算机cpu只有加法运算,其他运算都是模拟出来的,而补码的存在就是为了保证运算的准确性,如果你用原码进行计算那么上面运算答案将是错误的。
让我们来再看看
经过上面的图对比,我们发现整型在内存中储存数值的十六进制时,是倒着储存的!
在解释答案之前,我们先了解一下大小端字节序
那么为什么存在大小端字节序呢?
因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8比特,对于char类型一块内存就可以储存了,但还有int,short这些大于一个字节的类型,所以储存时必然存在数值前后存放顺序的问题,这种问题导致出现了不同的储存顺序的方法!
下面的习题中会存在,整型提升的问题,如果对整型提升语法有疑问的小伙伴可以点击学习一下【表达式求值】整型提升和算术转换问题_想要慢慢变得优秀的向阳的博客-CSDN博客
#include
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
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
int main()
{
char a = -128;
char b = 128;
printf("%u %d", a, b);
return 0;
}
#include
int main()
{
int i = -20;
unsigned int j = 10;
printf("%d\n", i + j);
//按照补码的形式进行运算,最后格式化成为有符号整数
return 0;
}
这里只用注意到,将整数放入int类型不需要截断,而且两个数的运算是通过补码进行的,如果运算后的补码为正,则原反补一样,输出结果直接就出来了,如果补码为负,则需要转换为原码,将原码值输出。