您的位置:首页 > 编程语言 > C语言/C++

C语言基本数据类型详解

2013-04-11 23:11 435 查看
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!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: