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

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这个过程

在这里插入图片描述

在这里插入图片描述

这里我们可以得出结论,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。

在这里插入图片描述

1.2 无符号char

在这里插入图片描述
在这里插入图片描述

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

所以我们得出结论:unsigned char能存储的数据范围是0 ~ 255。在limits.h文件中验证
在这里插入图片描述
在这里插入图片描述
两个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

在这里插入图片描述
对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

在这里插入图片描述

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

3. int类型讲解

3.1 有符号int

在这里插入图片描述

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

3.2 无符号int

在这里插入图片描述
最大值是2^32 - 1,二进制的32个1,在这里插入图片描述
在limits.h文件中验证在这里插入图片描述
8个f,从计算机的HEX中看出,我们的说法是正确的。


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

  • 28
    点赞
  • 100
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: #include <stdio.h> int main() { printf("char占用内存大小:%lu 字节\n",sizeof(char)); printf("short占用内存大小:%lu 字节\n",sizeof(short)); printf("int占用内存大小:%lu 字节\n",sizeof(int)); printf("float占用内存大小:%lu 字节\n",sizeof(float)); printf("double占用内存大小:%lu 字节\n",sizeof(double)); printf("long占用内存大小:%lu 字节\n",sizeof(long)); return 0; } 答案:char类型占用1个字节的内存,short类型占用2个字节的内存,int类型占用4个字节的内存,float类型占用4个字节的内存,double类型占用8个字节的内存,long类型占用8个字节的内存。 ### 回答2: 编写程序来打印C语言的不同数据类型所占用的内存大小。可以使用sizeof运算符来获取数据类型的大小,并将结果打印出来。以下是一个示例程序: #include <stdio.h> int main() { printf("char 类型的内存大小: %lu 字节\n", sizeof(char)); printf("short 类型的内存大小: %lu 字节\n", sizeof(short)); printf("int 类型的内存大小: %lu 字节\n", sizeof(int)); printf("float 类型的内存大小: %lu 字节\n", sizeof(float)); printf("double 类型的内存大小: %lu 字节\n", sizeof(double)); printf("long 类型的内存大小: %lu 字节\n", sizeof(long)); return 0; } 运行这个程序将会输出各个数据类型所占用的内存大小。请注意,具体的结果可能因为编译器和操作系统的不同而有所差异。 ### 回答3: 编写程序,可以使用sizeof操作符来打印C语言的不同类型所占内存大小。 ```c #include <stdio.h> int main() { printf("char型所占内存大小:%zu字节\n", sizeof(char)); printf("short型所占内存大小:%zu字节\n", sizeof(short)); printf("int型所占内存大小:%zu字节\n", sizeof(int)); printf("float型所占内存大小:%zu字节\n", sizeof(float)); printf("double型所占内存大小:%zu字节\n", sizeof(double)); printf("long型所占内存大小:%zu字节\n", sizeof(long)); return 0; } ``` 在这个程序中,我们使用`sizeof`操作符来获取不同类型的大小,并使用`%zu`格式化字符打印出来。`sizeof`返回的是一个`size_t`类型的值,它表示所占内存大小,因此我们使用`%zu`来打印这个值。 运行这个程序,你将得到如下输出结果: ``` char型所占内存大小:1字节 short型所占内存大小:2字节 int型所占内存大小:4字节 float型所占内存大小:4字节 double型所占内存大小:8字节 long型所占内存大小:8字节 ``` 这些值在不同的机器上可能会有所不同,因为它们取决于具体的编译器和操作系统。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值