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

Posted 呆呆兽学编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

分析如下:

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

以上是关于3分钟带你了解C语言中整形在内存中的存储的主要内容,如果未能解决你的问题,请参考以下文章

梦开始的地方 —— C语言数据在内存中的存储(整形+浮点型)

C语言进阶数据的存储

C语言%u%d打印的规则数据在内存中的存储及大小端存储模式

从初识到进阶,硬核解说C语言< 进阶篇 1 > 深度剖析数据在内存中的存储

详解c语言整形和浮点数在内存中的存储

C语言剖析数据在内存中的存储