整数在内存中的存储

今天和大家分享一下数据在内存中的存储形式。
首先,我们来介绍一下数据的类型
1.char 字符数据类型
2.short 短整型
3.int 整形
4.long 长整形
5.long long 更长的整形
6.float 单精度浮点型
7.double 双精度浮点型
以上就是数据的基本内置类型
那么我们还可以将数据类型细致地分为以下几类:
1.整形家族
char:
unsigned char
signed char
short:
unsigned short [int]
signed short [int]
int:
unsigned int
signed int
long:
unsigned long [int]
signed long [int]
2.浮点型家族
float
double
3.构造类型
a.数组类型
b.结构体数组 struct
c.枚举类型 enum
d.联合类型 union
4.指针类型
int *p
char *p
float *p
void *p
5.空类型
void(通常应用于函数返回类型、函数的参数、指针类型)

下面我们来介绍一下整形是如何在内存中存储的
首先,我们要明确有符号整数在计算机中的三种表示方法:
原码、反码、补码
注意三种表示方法均有符号位和数值位两部分,符号位0表示正1表示负
对于正数,原码反码补码均相同,为对应的二进制
对于负数来说 原码是对应的二进制
反码是保持符号位不变,其他位按位取反(即0变1,1变0)
补码是在反码的基础上加1
我们来举个例子:
整数在内存中的存储_第1张图片
以上就是-12这个数字的原码、反码、和补码的形式。
那么肯定有小伙伴要问了,负数的补码计算是比较麻烦的,那为什么要有补码这种形式?都用原码他不香吗?
事实上,正因为有了补码才香。
是这样的,在计算机系统中,数值一律用补码来表示和存储,使用补码,可以将符号位和数值域统一处理,同时加法和减法也可以统一处理(注意哦,CPU只有加法器而没有减法器哦)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。是不是很香?
好的,明确了原码反码补码后,我们再来看下一个问题,什么叫大小端?
你可能会问,纳尼?大小端是什么鬼?
整数在内存中的存储_第2张图片
这个是关于大小端概念的介绍
我们再来看看百度的说法
整数在内存中的存储_第3张图片

概念是抽象的,不好理解。讲一个故事据说大小端的叫法起源于一本世界名著《格列佛游记》在这本书中有一个吃鸡蛋是先吃大头还是先吃小头的争论,命名者受这个启发于是命名为大小端。这是一个很有意思的故事,也展示了科技与文学之间的浪漫。
同时,这个故事也可以用来帮助我们理解大小端这个概念,试想,作为一名合格的干饭人,如果你可以吃掉整个鸡蛋,无论你从大头吃还是从小头吃都没什么关系,因为最后肯定整个鸡蛋都是你的,但是如果你一下吃不掉整个鸡蛋,从哪头开始吃,决定了最后你吃到嘴里的鸡蛋是这个鸡蛋的哪一部分,当实力必须使你舍弃一块鸡蛋时,你能吃到什么,取决于你从哪一边开始吃。
放到我们这个概念里,这个逻辑还是行得通的,我们来看一个验证大小端的程序的例子,这个例子采用的方法的本质就类似于,吃不下一个鸡蛋,通过吃到的鸡蛋的来判断从哪头吃的。
整数在内存中的存储_第4张图片
我们来分析这个程序
整数在内存中的存储_第5张图片
好的,以上是我关于大小端的掌握到的一些知识和一些理解,欢迎大家指正。下面我们一起来看几道题

我们来看看这个短小精悍的小程序,猜一猜它会输出什么呢?

#include
int main()
{
     
	char a = -128;
	printf("%u", a);
	return 0;
}


答案是:
整数在内存中的存储_第6张图片
为什么会出现这样的结果呢?我们来一起分析一下:
整数在内存中的存储_第7张图片
我们再来看下一个题:

#include
int main()
{
     
	int i = -20;
	unsigned int j = 10;
	printf("%d\n", i + j);
}

整数在内存中的存储_第8张图片

我们来分析一下这个题
整数在内存中的存储_第9张图片
我们再来看一个题

#include
int main()
{
     
	unsigned int i;
	for (i = 9; i >= 0; i--)
	{
     
		printf("%u\n", i);
	}
	return 0;
}


猜猜这个题的输出结果是什么?给你看看这吓人的效果:
整数在内存中的存储_第10张图片
这是一个死循环,屏幕上噼里啪啦的一直出数也够吓人的,哈哈哈。
为什么会出现这样的结果呢?
我们来分析一下这个程序
整数在内存中的存储_第11张图片
我们再来看一个题

#include
#include
int main()
{
     
	char a[1000];
	int i;
	for (i = 0; i < 1000; i++)
	{
     
		a[i] = -1 - i;
	}
	printf("%d", strlen(a));
	return 0;
}

这个题很有陷阱,如果我们不仔细思索的话,大概会认为输出结果是1000了,开始真相是不是这样呢?让我们来看看运行结果
整数在内存中的存储_第12张图片
瞧瞧这惊人的结果,为什么不是1000?这合理吗?这合理!
我们来分析一下这个题
整数在内存中的存储_第13张图片
看完以上分析,有没有豁然开朗的感觉呢?
好了,今天的分享就到这里了,如果感觉我的分享对你有所帮助的话,欢迎点赞、评论、关注哦!由于本人能力有限,难免有错漏之处,欢迎批评指正!

你可能感兴趣的:(整数在内存中的存储)