整形在内存中的存储

原码、反码、补码

原码:

概念:将一个数表示成二进制就是源码

比如:
在这里插入图片描述

反码:

概念: 原码的符号位不变,将其他位取反就得到反码

  • 正数的原码、反码、补码都相同

比如:
在这里插入图片描述

补码

概念:将一个数的反码加一就是补码

比如:
在这里插入图片描述


整形提升和截断

整形提升:

概念: C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型
提升。

有符号的整型提升:

规则:前面的位数补上符号位

比如:在这里插入图片描述

无符号的整形提升:

规则:前面的位数补0

比如:在这里插入图片描述


大、小端存储

来看一段代码:

int main()
{
	int a = 10;
	return 0;
}

我们已经知道10的二进制序列和16进制序列为:
在这里插入图片描述

在VS2022里调试并打开内存窗口:
在这里插入图片描述

  • 可以看到我们对a取地址看到的内存和我们原先表示 的16进制序列不一样

    那究竟是为什么呢?


小端存储

概念 :

小端存储是指在内存中一个数的低位存在内存的低地址处,高位存在高地址处,且以字节为单位。

啥意思?看图!!!

就拿10在内存中的存储来说(以下的地址都是假设的):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8RgrfLby-1660276364302)(C:\Users\txf\AppData\Roaming\Typora\typora-user-images\image-20220812101217405.png)]

我们知道在内存中:一个字节分配一个内存地址

0a是一个字节,处于低位,被存到到0x10处。

然后是00,以此类推

在VS2022中是小端存储:

在这里插入图片描述

大端存储

概念:

大端存储指的是一个数在内存中低位存在高地址处,高位存在低地址处。

示例:

在这里插入图片描述


应用举例

应用一

以下代码输出什么?

#include <stdio.h>
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;
}

a

char a = -1; 相当于signed char a = -1;

存-1时:

-1的补码

11111111 11111111 11111111 11111111

但是由于a是char类型会发生整形截断

所以最终存到a中为:

11111111

打印-1时:

会发生整形提升

所以-1在内存中的补码又变成:

11111111 11111111 11111111 11111111

但是这还是补码,还要转换成原码!!!

反码(补码-1):

11111111 11111111 11111111 11111110

原码(反码的符号位不变,其他位按位取反):

10000000 00000000 00000000 00000001

所以输出-1

b

a的情况和b一样

c

在这里插入图片描述

运行截图:

在这里插入图片描述

应用二

设计一个小程序来判断当前机器的字节序 。

思路:

1.定义一个变量存1

2.1表示成16进制为00 00 00 01

3.取出首地址的值

如果为1那么就是小端字节序

如果为0那么就是大端字节序

代码:

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

VS2022下运行截图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E5f5xfsZ-1660276364305)(C:\Users\txf\AppData\Roaming\Typora\typora-user-images\image-20220812114546833.png)]


如果对你有帮助,不妨点个赞吧😄


  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值