C语言——数据在内存中的存储(上)

目录

一.数据类型的详细介绍 

二.大小端字节介绍及判断


一.数据类型的详细介绍 

我们都知道内置的数据类型有:c4a8e6aa8d8f46ea9955b95badc86fc3.png

 不知道大家是否好奇它们本身类型的意义是什么呢???

我将从下面2个方面来讲解:

1.使用这个类型开辟内存空间的大小(大小决定了使用范围)

2.如何看待内存空间的视角

  •  类型的基本归类
  • 整型家族:
  • 4b29ead41b2a4d2cae170fe7f266feec.png
  •  浮点数家族:
  • 3187bc7e737b4429bb8b79835994b052.png
  •  构造类型:

658bbc68106548b2b45dbe5d557429fd.png

 而数组类型:除去变量名就是数组类型

比如:

int arr[10]        类型:int [10]

int arr[5]               类型:int [5]       

char arr[10]        类型:char [10]

这三个就是不同的类型

  • 指针类型:
  • dcc0f225d4664eda96aa6acc068804ae.png
  •  空类型:
  • edd02d9848db4e2c9a1d4ef7bca45e4d.png

 

 我们知道创建变量是需要向内存开辟空间的。空间的大小是根据类型的不同而不同

70a20ede86644d14b5a6851fa4ea0923.png

 比如,我们创建了int 类型的a和b,我们都知道int类型要分配4个字节的空间,那在计算机中是如何存储的呢??我们往下看!!

在这之前我们需要了解一些原码 反码 补码的一点知识

c6e8089a24f34b46b64c3145d979c81f.png

而补码就是在反码上+1 

我们为什么要讲这个呢???因为数据存放内存中其实存放的就是补码!!

自然我们也会有疑惑,为什么呢??

cfdbdd76736640c2961322ee102ddb29.png

 4a045c3e15074be2a76e8daf1745f3f7.png

821cbec79ff945d9a72ad0d3befa90a8.png

 我们通过调试窗口看a和b变量在内存中的存储

这时,我们就看见了在内存中a和b变量在内存中的存储是以补码的形式,但我们也有新的疑惑,是不是顺序有点问题呢???

二.大小端字节介绍及判断

这时,我们要讲到大小端,那什么是大小端呢??

大端:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中

小端:是指数据的高位保存在内存的高地址中,而数据的低位,保存在内存的低地址中

为什么要有大端和小端呢??

a3a1e4694793462e8a157fc792e9b50b.png

 我们来验证一下在VS中是小端存储还是大端存储呢??

int cheak_sys()
{
	int i = 1;
	return (*(char*)&i);

}

int main()
{
	int ret = cheak_sys();
	if (ret == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}


	return 0;
}

e315d8aa76054f0cb4a4381f2e445a0d.png

 通过验证我们发现在VS中,是以小端的形式存储的,这时我们也就能理解a和b顺序为什么是倒着存储的了

e3ed821dcb104e5aac94fcdcc297420e.png

  • 我们来练习一下:
  •  
    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;
    }

    结果是多少呢???

  • 6ef6a00e18ed48eeba6f54ed6444c9c9.png

     为什么呢???

    b5bd372e6230429790d0a18fa7fe768f.png

     所以unsigned char a结果就是255

    我们来看下列代码:

    
    int main()
    {
    	char a = -128;
    	//10000000 00000000 00000000 10000000  -原码
    	//11111111 11111111 11111111 01111111 -反码
    	//11111111 11111111  11111111 10000000 -补码
    	//发生截断 10000000 
    	//整型提升后  11111111  11111111 11111111 10000000
    
    	printf("%u\n", a);
    
    	return 0;
    }

    9c2f460a201b4c01ba8c2feebc39586c.png

    我们可以通过计算机来看一下

    2c11094a57894f488d16254ddce90c88.png

    我们来看最后一道例题:

    unsigned char i = 0;//0~255 
    int main()
    {
    	for (i = 0; i <= 255; i++)
    	{
    		printf("Hello World\n");//死循环打印   因为unsigned char 范围为0~255  当i为255时,i++后会变成0  形成一个循环  所以for循环条件恒成立
    	}
    
    	return 0;
    }

    为什么会循环打印呢???我们知道unsigned char i

    的范围为0~255 又因为是无符号数,当i超过255时,会变成0

    所以满足for循环条件,一直打印

最后:希望通过这篇文章让你对无符号整数有更好的理解,我也会不定时更新,分享我的学习经历

  • 43
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 32
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值