c语言 char / short / int中能存储多大的数据?

我们都知道char能存储的数据范围是-128 ~ 127,unsigned chard 范围是0 ~ 255。short能存储的数据范围是-32768 ~ 32767,unsigned short 范围是0 ~ 65535。int能存储的数据范围是-2147483648 ~ 2147483647,unsigned int的范围是0 ~ 4294967295。但为什么是这样的范围,我们从没有深究过,这篇博文将对此进行深入的讲解,希望能加深你对这些类型范围的了解。

文章目录

    • 1. char类型讲解
      • 1.1 有符号char
      • 1.2 无符号char
    • 2.short类型讲解
      • 2.1 有符号short
      • 2.2 无符号short
    • 3. int类型讲解
      • 3.1 有符号int
      • 3.2 无符号int

1. char类型讲解

1.1 有符号char

char的大小为一个字节,八个比特位,我们就从0开始,那char的二进制补码先是
00000000 接着是
00000001

01000000

01111111
这时的char是255,再加1结果是
10000000 - 这个数是负数,首先它是不能计算的,我们不用转换它成原码,计算机直接把它解析成-128
10000001 - 这个数转换成原码是11111111,十进制是-127
10000010 - -126

11111111 - 原码是-1,再加1得到的就是0了。综上我们可以用一个圆来表示char能存储的数值

不理解没关系,我画个图来说明char从0开始不断地加1这个过程

c语言 char / short / int中能存储多大的数据?_第1张图片

c语言 char / short / int中能存储多大的数据?_第2张图片

这里我们可以得出结论,char从0开始不断地加1,会陷入循环,
从0 … 127,-128,-127…-2,-1,0 … 127,-128,-127…就像上面的圆一样

因此得到结论signed char中能存储的数据范围是-128 ~ 127,我们可以通过limits.h文件验证我们的说法在这里插入图片描述


来看一个程序


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

这是上篇博客中提到的一题,现在对这题是不是有更深的理解了?

字符数组a从-1到-128,再减1得到127,127到1,最后到0。字符串遇到\0(\0的ASCII码值是0)停止,所以字符串长度是-1 ~ -128,1 ~ 127,之间的数字个数,求出的长度就是255。

c语言 char / short / int中能存储多大的数据?_第3张图片

1.2 无符号char

c语言 char / short / int中能存储多大的数据?_第4张图片
c语言 char / short / int中能存储多大的数据?_第5张图片

对最后的11111111加1得到0,又循环回去了。

所以我们得出结论:unsigned char能存储的数据范围是0 ~ 255。在limits.h文件中验证
在这里插入图片描述
c语言 char / short / int中能存储多大的数据?_第6张图片
两个f就是255,也是二进制的8个1。


再来看一道题


int main()
{
	unsigned char i = 0;

	for (i = 0; i <= 255; i++)
	{
		printf("hello world\n");
	}
	return 0;
}

同样也是上篇博客中提到的题目,正是因为对unsigned char不断地加1会陷入0~255再到0 ~ 255这样的循环,使得i总是满足i <= 255这个条件,所以hello world会不断地在屏幕上输出。

2.short类型讲解

2.1 有符号short

c语言 char / short / int中能存储多大的数据?_第7张图片
对short的0不断加1,这个过程和char一样,只是因为short有16个bit位,所以short最大的数是01111111 11111111,转换成十进制是32767,再加1是10000000 00000000,计算机直接把它解析成-32768…

后续的过程和char一样,我就不再赘述。由此我们得出结论,signed short能存储的数据范围是-32768 ~ 32767。

在limits.h文件中,定义short的范围如下
在这里插入图片描述

2.2 无符号short

c语言 char / short / int中能存储多大的数据?_第8张图片

由于是无符号数,不用单独解析最高位的符号位,直接把二进制序列转换成十进制,当16位bit都是1时,十进制就是c语言 char / short / int中能存储多大的数据?_第9张图片
所以unsigned char能存储的数据范围是0 ~ 65535,在limits.h文件中是十六进制的f f f f,根据上图的HEX一行,也能验证我们的说法是对的。
在这里插入图片描述

3. int类型讲解

3.1 有符号int

c语言 char / short / int中能存储多大的数据?_第10张图片

最大值是2^31 - 1,最小值是- 2 ^ 31。在limits.h文件中验证一下。在这里插入图片描述

3.2 无符号int

c语言 char / short / int中能存储多大的数据?_第11张图片
最大值是2^32 - 1,二进制的32个1,c语言 char / short / int中能存储多大的数据?_第12张图片
在limits.h文件中验证在这里插入图片描述
8个f,从计算机的HEX中看出,我们的说法是正确的。


好了,相信你对char,short,int三中基本类型存储范围的了解已经很透彻了,希望这篇博客能对你有帮助。

你可能感兴趣的:(【C语言】学习总结,c语言,开发语言,后端)