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。
通过下面的例子可以看出:
当然,毫无疑问,其结果就是:flag only the position of end is not zero!
注: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!