(感谢各位大佬的点击,本人第一篇博客,后续会再接再厉的)
重点内容(先来瞅一瞅)
1.整形在内存中的存储:原码、反码、补码
2.大小端字节序介绍及判断
1.整形在内存中的存储
一个变量本身的创建是要在内存中开辟空间的。空间的大小是根据本身类型决定的。
比如,大家都知道一个int类型的变量,自身被分配四个字节的空间。
但是其是如何在内存里面如何存储的?
下面我们来了解以下概念:
1.1原码、反码、补码
其内容简述,即计算机中的整数有三种表达方式,原码、反码、补码。
此三种表达方式均有符号位和数值位两部分的,符号位都是用0表示‘正’,用1表示‘负’
数值位上,正整数其原,反,补码相同
负整数则有以下规律
原码
直接将二进制按照正负数的形式翻译成二进制就可以
反码
将原码的符号位不变,其他位依次按位取反即可
补码
在反码的基础末尾加一即可
对于整形来说:数据存放内存中其实存放的是补码。
为什么呢!!!
其原因在于,在计算机系统中,使用补码,可以将符号位和数值域统一处理:
同时,加法和减法也可以统一处理,CPU只有加法器,此外,补码和原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
下面代码展示
#include <stdio.h>
int main()
{
int a=-10;
int b=10;
return 0;
}
(注:地址显示多以十六进制表示,其中越靠近0X 的 字节权值位越高,即数据的高位)
(0X表示该地址是以十六进制显示)
此时我们可以很容易的观察到,存储的是补码不假,但是为什么顺序却有些奇怪呢?
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 牛刀小试
练习一:
练习二: