一、单字节能表示的范围

(一)无符号单字节

一个字节有8位,取值范围为0000000011111111,化为十进制即为0255。所以无符号的一个字节可以表示的数字范围为0~255,共256个数。

##(二)有符号单字节
若有符号,则最高位表示符号位,0表示正号,1表示负号。能表示的正数的最大值为01111111,即十进制的127。能表示的负数的最小值不是11111111,而是10000000。10000000是个特殊的数字,1既表示负号,也参与了运算,化为十进制则为-27 = 128。而11111111则是第二小的数,化为十进制则为-127。
所以有符号的一个字节可表示的数字范围为-128 ~ 127,共256个数。
一个字节 = bit。

二、布尔类型

可以使用sizeof运算符求出基本数据类型的大小。

例1

#include <stdio.h>

int main()
{
printf("%d\n", sizeof(bool));
return 0;
}

运行结果:

1

分析:
这里可以看出,每个bool变量占一个字节。因为bool只有两个值,true和false,即1和0。所以用一个bit位就足够表示了。这里用一个字节实际上是浪费了内存。但是因为计算机存储数据的基本单位是Byte,不是bit。所以也没什么办法。
sizeof不是一个函数,而是一个运算符。作用是计算所占内存大小。

三、字符型

考虑到A-Z的ASCII码为65-90,a-z的ASCII码为97-122。这两段的数据范围,用一个字节就可以表示。所以每个字符占用一个字节。下面用程序验证一下:

例2

#include <stdio.h>

int main()
{
printf("%d\n", sizeof(char));
return 0;
}

运行结果:

1

四、整型

C和C++中,整型有四种:int、unsigned int、long long、unsigned long long。
unsigend int和int都占4个字节的内存,区别在于,int带符号的,最高位用来表示符号,0为正1为负;unsigned int不带符号,最高位不表示符号,而是参与运算表示数字。unsigned int可以简写为unsigned。
int的最大值是01111111,11111111,11111111,11111111,即十进制的231 – 1 = 2 147 483 647。最小值是10000000,00000000,00000000,00000000,00000000,即十进制的-231 = -2 147 483 648。所以int的数据表示范围大概在-21亿到21亿之间。
unsigned int的最大值是11111111,11111111,11111111,11111111,最小值是00000000,00000000,00000000,00000000,00000000,即十进制的0 ~ 4 294 967 295。

short int和unsigned short int都占2个字节的内存,区别在于,short int带符号的,最高位用来表示符号,0为正1为负;unsigned short int不带符号,最高位不表示符号,而是参与运算表示数字。
short int能表示的数据范围为-215 ~ 215 – 1,即-32768 ~ 32767。
unsigned short int能表示的数据范围为0 ~ 216 – 1,即0 ~ 65535。

unsigend long long和long long都占8个字节的内存,区别在于,long long带符号的,最高位用来表示符号,0为正1为负;unsigend long long不带符号,最高位不表示符号,而是参与运算表示数字。
long long能表示的数据范围为-263 ~ 263 – 1。
unsigned long long能表示的数据范围为0 ~ 264 – 1。

例3

#include <stdio.h>
#include <limits.h>

int main()
{
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(unsigned int));

printf("%d\n", sizeof(short));
printf("%d\n", sizeof(unsigned short));

printf("%d\n", sizeof(long long));
printf("%d\n", sizeof(unsigned long long));

printf("%d\n", INT_MAX);
printf("%d\n", INT_MIN);

return 0;
}

运行结果:

4
4
2
2
8
8
2147483647
-2147483648

五、浮点型

float类型占4个字节,double类型占8个字节。

例4

#include <stdio.h>

int main()
{
printf("%d\n", sizeof(float));
printf("%d\n", sizeof(double));

return 0;
}

运行结果:

4
8

float能表示的整数范围约为-3.4 * 1038 ~ 3.4 * 1038,精度即有效数字为7位。
double能表示的整数范围约为-1.79 * 10308 ~ 1.79 * 10308,精度即有效数字为15位。
虽然float和double能表示的整数范围比int和long long能表示的整数范围大的多,但因为浮点数无法精确表示,所以要表示整数(精确值)时,只能用整型变量来表示,不能使用浮点型变量来表示。


小朋友学C语言(44):基本数据类型的大小和取值范围_带符号