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

一、单字节能表示的范围

(一)无符号单字节

一个字节有8位,取值范围为00000000~11111111,化为十进制即为0~255。所以无符号的一个字节可以表示的数字范围为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能表示的整数范围大的多,但因为浮点数无法精确表示,所以要表示整数(精确值)时,只能用整型变量来表示,不能使用浮点型变量来表示。

原文发布于微信公众号 - 信息学竞赛NOIP(gh_de7b45c40e8b)

原文发表时间:2019-01-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券