3分钟带你了解C语言中整形在内存中的存储


—————————————————————————

写在前面

我们都知道,一个变量的创建是要开辟一块空间的,空间的大小由数据的类型来决定的。你是否好奇整形在内存中十如何存储的?今天我们就来聊一聊这个问题。

整形家族有哪些?

整形家族包括char(字符型),short(短整形),int(整形),long(长整型)等。其中可以用有符号和无符号来修饰他们。

整形数据的三种表示形式

计算机中的数据有原码,反码和补码三种表示方法。有符号的整形数据分为符号位和数值位,无符号的整形数据只有数值位。符号位是用“1”表示负,“0”表示正。有规定:正数的原反补相同。

原码

将一个数按照规定的正负以二进制形式表示出即可。

例:int a=1; a的原码就是 00000000 00000000 00000000 00000001
int b = -1; b的原码就是 10000000 00000000 00000000 00000001

反码

将原码的符号位不变,其他位按位取反。

例:int a=1; a的反码就是 00000000 00000000 00000000 00000001
int b = -1; b的反码就是 11111111 11111111 11111111 11111110

补码

反码+1得到补码。

例:int a=1; a的补码就是 00000000 00000000 00000000 00000001
int b = -1; b的补码就是 11111111 11111111 11111111 11111111

为什么整型数据在内存中以补码的形式存在?

在计算机系统中,数值一律用补码来表示和存储,原因在于使用补码可以将符号位和数值位统一处理;同时加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是形同的,不需要额外的硬件电路。

例:l两个整形数据1-1相运算过程。其实可以转化为1+(-1)
int a=1;
a的原码就是 00000000 00000000 00000000 00000001
a的反码就是 00000000 00000000 00000000 00000001
a的补码就是 00000000 00000000 00000000 00000001
int b = -1;
b的原码就是 10000000 00000000 00000000 00000001
b的f反码就是 11111111 11111111 11111111 11111110
b的补码就是 11111111 11111111 11111111 11111111
两数相加
假定用原码相加
00000000 00000000 00000000 00000001
10000000 00000000 00000000 00000001
结果是 10000000 00000000 00000000 00000010 (负数取出要转为原码)
原码=(反码-1)后再符号位不变其他为按位取反
原码就是 1111111 11111111 11111111 11111110(即-2^31+2)显然不正确
假定补码相加
00000000 00000000 00000000 00000001
11111111 11111111 11111111 11111111
结果的 1 00000000 00000000 00000000 00000000
保留一个整形的长度之后就是
00000000 00000000 00000000 00000000 (即0)

以上例子说明了整形在内存中以补码形式存在的。

整形家族中char类型的范围

如图,signed char 的范围为-128~127,unsigned char的范围为 0 ~ 255。
在这里插入图片描述

整形数据存储中的大小端模式

这里可以看看我的往期博客整形数据在内存中存储的大小端模式

有关整形在内存中存储的几道题目

题1:

1.
//输出什么?
#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=-1,b=-1,c=255。
题2:

#include <stdio.h>
int main()
{
  char a = -128;
  printf("%u\n",a);
  return 0;
}

分析如下:
在这里插入图片描述
所以答案是4294967168。
题3:

#include <stdio.h>

int main()
{
	char a = 128;
	printf("%u\n", a);
	return 0;
}

分析如下:
在这里插入图片描述
题4:

#include <stdio.h>

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

分析如下:
在这里插入图片描述
所以答案为-10。
题5:

#include <stdio.h>

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

分析如下:
在这里插入图片描述

在这里插入图片描述
题6:

#include <stdio.h>

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

分析如下:在这里插入图片描述
所以答案是255。
题7:

#include <stdio.h>
unsigned char i = 0;
int main()
{
	for (i = 0; i <= 255; i++)
	{
		printf("hello world\n");
	}
	return 0;
}

分析如下:
在这里插入图片描述
在这里插入图片描述

今天就简单介绍到这了,欢迎大家点赞支持和指正~

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆呆兽学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值