C语言基本数据类型详解

本文详细介绍了C语言中各种基本数据类型(如char、int、short int、long int、float和double)在32位与64位机器上的占用字节数及取值范围,并深入解析了浮点数的IEEE表示方法。
摘要由CSDN通过智能技术生成
char 类型:在32位机器上占1B,在64位机器上同样占1B;
注:char类型因存储文本串中的单个字符而得名,所以无论在32为机器还是64为机器,都占一个字节。
取值范围:0~255;
原因:由于char类型占1B,而1B有8bit,所以其取值范围为:00000000~11111111 (即:0~255)

对于整型,short至少为16bit,long至少为32bit。至于缺省的int究竟是16bit还是32bit,或者是其他值,则由编译器设计者决定。但需
注意:int类型的长度不能超过long类型。通常这个选择的缺省值是这种机器最为自然(高效)的位数。
int 类型:在32位机器上占4B,在64位机器上同样占4B;
取值范围:无符号(unsigned int):0~4294672295(2^32);
有符号(int):-2147483648~2147483647(2^31)
原因:由于int 类型占4B,而4B有32bit,所以其取值范围为:0~2^32,无符号类型同理。

short int 类型:在32位机器上占2B,在64位机器上同样占2B;
取值范围:无符号(unsigned short)0~65535(2^16);
有符号(short):-32768~32767(2^15)
原因:由于short int 类型占2B,而2B有16bit,所以其取值范围为:0~2^16,无符号类型同理。

long  int 类型:在32位机器上占4B,在64位机器上占8B;
取值范围:在32位机器上为:无符号(unsigned long)0~4294672296(2^32);
有符号(long):-2147483648~2147483647(2^31)
在64位机器上为:无符号(unsigned long)0~2^64; 
有符号(long):2^63~2^63-1
原因:在32位机器上,由于long int 类型占4B,而4B有32bit,所以其取值范围为:0~2^32,无符号类型同理。
在64位机器上,由于long int 类型占8B,而8B有64bit,所以其取值范围为:0~2^64,无符号类型同理。

由于以上数据类型都是表示的都是整数,所以其处理过程都是相同的,而对于浮点型数据,计算机并不是按照处理整数的方式来处理的。
所以对于浮点型的数据,应另当别论。
现在的计算机系统基本上采用的都是IEEE浮点表示。所以我们先简单了解一下IEEE浮点表示。
IEEE浮点标准用V = (-1)^s*M*2^E的形式来表示一个数:
符号(sign):s决定这个数是负数(s=1)还是正数(s=0),而对于数值0的符号位解释作为特殊处理;
尾数(sifnficand):M是一个二进制小数,它的范围是1~2-ε,或者0~1-ε;
阶码(exponent):E的作用是对浮点数加权,这个权重是2的E次幂(可能是负数)。
将浮点数的位表示划分为三个字段,分别对这些值进行编码:
1. 一个单独的符号位s直接编码符号s;
2. k位阶码字段exp编码阶码E;
3. n位小数字段frac编码尾数M,但是编码出来的值依赖于阶码字段的值是否等于0;

在C语言中:单精度浮点(float)格式中,s、exp、和frac字段分别为1位,k=8位和n=23位,得到一个32位表示。
           双精度浮点(double)格式中,s、exp、和frac字段分别为1位,k=11位和n=52位,得到一个32位表示。
所以如果给定位表示,就可根据exp的值,将被编码的值可以分成三种不同的情况:
1. 规格化的值:这是最普遍的情况。当exp的位模式不全为0(数值为0),也不全为1(单精度数值为255,双精度数值为2047)时,
都属于这类情况。在这种情况中,阶码字段被解释为以偏置形式表示的有符号整数。也就是说,阶码的值是E=e-Bias,其中e是无
符号数,其位表示为ek-1…e1e0(注:i为下标),而Bias是一个等于2^(k-1)-1(单精度为127,双精度是1023)的偏置值。
由此产生的指数的取值范围为:
对于单精度:-126~+127;(00000001-127 ~ 11111110-127)
对于双精度:-1022~+1023  (00000000001-1023 ~ 11111111110-1023)
注:由于exp的位模式既不能全为0,也不能全为1,所以对于单精度来说,e的范围为00000001~11111110
对于双精度来说,e的范围为00000000001~11111111110;
对于小数字段frac的解释为描述小数值f,其中0 <= f < 1,其二进制表示为0.f(n-1)…f1f0(n为下标),也就是二进制小数点的最高有效位
的左边。尾数定义为M=1+f。
2.非规格化的值:当阶码域为全0时,所表示的数就是非规格化形式。在这种情况下,阶码值是E=1-Bias,而尾数值是M=f,也就是小数字
段的值。
3.特殊值:毫无疑问,只有阶码全为1这种情况了。当小数域全为0时,的到的值表示无穷,当s=0时,表示正无穷,当s=1时,表示负无穷。
float 类型:在32位机器上占4B,在64位机器上同样占4B;
取值范围:
对于规格化的值:-2^(127)*(1 + 2^(-1)+2^(-2)+……+2^(-23)) ~ 2^127*(1 + 2^(-1)+2^(-2)+……+2^(-23));
对于非规格化的值:-2^(-126)*(2^(-1)+2^(-2)+……+2^(-23)) ~ 2^(-126)*(2^(-1)+2^(-2)+……+2^(-23));

double 类型:在32位机器上占8B,在64位机器上同样占8B;
取值范围:
对于规格化的值:-2^(1023)*(1 + 2^(-1)+2^(-2)+……+2^(-52)) ~ 2^1023*(1 + 2^(-1)+2^(-2)+……+2^(-52));
对于非规格化的值:-2^(-1023)*(2^(-1)+2^(-2)+……+2^(-52)) ~ 2^(-1023)*(2^(-1)+2^(-2)+……+2^(-52));

在这里顺便提一下bool类型,注意:bool类型只有C++中才有,在C语言中没有定义bool类型;
bool类型:在32位机器上占1B,同样在64位机器上占1B。需要注意的是,在C++中,0为false,非0为true。实际上bool类型并没有真正地占1个字节,
而只是占了1bit。
通过下面的例子可以看出:
#include <stdio.h>
int main(void)
{
    bool flag = true;
    int num = 255;//255的二进制表示为11111111

    if ((num & flag) == 1)
    {
         printf("flag only the position of end is not zero!\n");
    }

    return 0;
}

当然,毫无疑问,其结果就是:flag only the position of end is not zero!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值