数据在内存中的存储.1

文章详细解释了大端存储和小端存储的概念,以及二进制、原码、反码和补码的关系。通过示例展示了数值在内存中以二进制补码形式存储,并通过C程序演示了如何判断系统是大端还是小端。此外,还讨论了无符号类型和有符号类型的区别,特别是在数值范围和表示上的差异。
摘要由CSDN通过智能技术生成

目录

1.大端存储与小端存储

2.二进制,原码,反码,补码.

3.数值的存储方式

4.如何写个程序用一段代码来判断大小端

5.无符号类型,有符号类型


1.大端存储与小端存储

大端存储:把一个数据的低位字节的内容,存放在高地址处,把一个数据的高位字节的内容存放在低地址处

小端存储:把一个数据的低位字节的内容,存放在低地址处,把一个数据的高位字节的内容存放在高地址处

 

2.二进制,原码,反码,补码.

正数的原码反码补码相同,下面是负数的原码反码补码之间的转换

原码:直接将数值按照正负数的形式翻译成二进制就可以得到原码。

反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

补码:反码+1得到了补码。

以10和-10为例,下面是他们的原码反码补码

 接下来继续探究数据是以什么形式存放的


3.数值的存储方式

本质上内存中存放的是二进制,vs为了方便显示,以十六进制的方式显示的

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int a = 10;
	int b = -10;
	return 0;
}

创建整形变量,一个整型变量有四个字节,用32个比特位存储

按下F10进入调试,在窗口中打开内存,观察a,b的值

上面这是a存储的内容  0a 00 00 00

上面这是b存储的内容 f6 ff ff ff

再将上面a的补码转化为十六进制:00 00 00 0a

               b的补码转化为十六进制:  ff   ff  ff  f6

不难发现,vs中a,b存储的数据分别是他们的十六进制,但是顺序比较奇怪(参考上方小端,大端存储),是十六进制的逆序

逆序是因为在vs中采取的是小端字节序存储

所以我们的得出了结论:在计算机系统中,数值是以二进制补码的形式存储的


4.如何写个程序用一段代码来判断大小端

 定义一个整型变量a=1;它的十六进制表示方式如上图所示

a的大小端表示如下图所示:

 

观察两者区别小端存储的01放在前面,大端存储的0放在后面,此时我们可以巧妙的将

a的地址取出来,此时&a为int*类型,当我们将int*类型强制转化为char*类型后,再进行解引用,就可以访问到第一个字节的内容。

                                                &a-->(char*)&a-->*(char*)&a

如此操作之后,如果得到的值是1那么就说明是小端存储,若为0则是大端存储,上代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
	int a = 1;
	int ret = *((char*)&a);
	if (ret == 1)
	{
		printf("小端输出");
	}
	else
	{
		printf("大端输出");
	}
	return 0;
}

 

可以看到在vs上数据存储是小端存储


5.无符号类型,有符号类型

 unsigned int a 定义一个无符号的整型a

无符号类只针对整型

有符号 short==signed short,无符号unsigned short

但是在c语言中并无规定char代表unsigned char还是signed char

有符号的short类型,有1个符号位,15个数值位

但无符号的short类型,有0个符号位,16个数值位

无符号型,11111111的计算结果是255

有符号型,11111111的计算结果是-128

signed char的范围是  -127~128,如图

无符号型,11111111的计算结果是255

有符号型,11111111的计算结果是-128

 unsigned char的范围是0~255

 signed char类型数值的变化可用下图生动表示出来

 而对于unsiged char类型的数值变换则可用下图表示

 创作不易,留下你的赞吧

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值