我们都知道char能存储的数据范围是-128 ~ 127,unsigned chard 范围是0 ~ 255。short能存储的数据范围是-32768 ~ 32767,unsigned short 范围是0 ~ 65535。int能存储的数据范围是-2147483648 ~ 2147483647,unsigned int的范围是0 ~ 4294967295。但为什么是这样的范围,我们从没有深究过,这篇博文将对此进行深入的讲解,希望能加深你对这些类型范围的了解。
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。
对最后的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会不断地在屏幕上输出。
对short的0不断加1,这个过程和char一样,只是因为short有16个bit位,所以short最大的数是01111111 11111111,转换成十进制是32767,再加1是10000000 00000000,计算机直接把它解析成-32768…
后续的过程和char一样,我就不再赘述。由此我们得出结论,signed short能存储的数据范围是-32768 ~ 32767。
由于是无符号数,不用单独解析最高位的符号位,直接把二进制序列转换成十进制,当16位bit都是1时,十进制就是
所以unsigned char能存储的数据范围是0 ~ 65535,在limits.h文件中是十六进制的f f f f,根据上图的HEX一行,也能验证我们的说法是对的。
最大值是2^31 - 1,最小值是- 2 ^ 31。在limits.h文件中验证一下。
最大值是2^32 - 1,二进制的32个1,
在limits.h文件中验证
8个f,从计算机的HEX中看出,我们的说法是正确的。
好了,相信你对char,short,int三中基本类型存储范围的了解已经很透彻了,希望这篇博客能对你有帮助。