数据类型 | 32位字节数 | 64位字节数 | 数据值范围 |
bool(布尔型) | 1 | 1 | ture(非0),false(0) |
char(字符型) | 1 | 1 | -128~127 |
unsigned char | 1 | 1 | 0~255 |
short(短整型) | 2 | 2 | -32768~32767 |
unsigned short | 2 | 2 | 0~65535 |
int(整形) | 4 | 4 | -2^31 ~ 2^31 |
unsigned int | 4 | 4 | 0~2^32-1 |
long(长整型) | 4 | 8 | |
unsigned long | 4 | 8 | |
long long(长整型) | 8 | 8 | -2^64~2^64-1 |
float (单精度浮点数) | 4 | 4 | -2^128~2^128 (精度为6~7位有效数字) |
double (双精度浮点数) | 8 | 8 | -2^1024~2^1024 (精度为15~16位有效数字) |
long double (扩展精度浮点数) | 8 | 8 | -2^1024~2^1024 (精度为15~16位) |
* | 4 | 8 |
关于数据存储常见的问题:
(1)int 和long的区别:
因为早期的操作系统大多是16位的,所以C语言设计者就规定了“整型”和“长整型”两种数据类型。
在16位系统中int所占字节大小为2字节,而long用4字节表示。
而32位系统中,依照标准:长整型至少和整型一样长,整型至少和短整型一样长。没有规定long一定要比int长,也没有规定short要比int短,所以int 用4字节表示,long也是4字节。
目前的操作系统已发展到64位操作系统,但因程序编译工艺的不同,两者表现出不同的差别:所以int型依旧是4字节,long int变成了八字节。
(2)long long int 型
long long在win32中是确实存在,长度为8个字节;定义为LONG64。但long long 是C99标准中新增的类型关键字,老版本的编译器比如vc6.0就无法识别此类型,编译会报错。
另外,32位系统中longlong类型的数值转换成其他类型数据时,会因为数据本身所占空间大小不同,发生截断(例:在32位下,long类型只保留4个字节,而long long 有8个字节,long long转换成long类型时会缩短long long类型的数值的长度,导致数据不正确)。
(3)float与double的范围和精度
1).范围
float和double的范围是由指数的位数来决定的。
float的指数位有8位,而double的指数位有11位,分布如下:
float:
1bit(符号位) 8bits(指数位) 23bits(尾数位)
double:
1bit(符号位) 11bits(指数位) 52bits(尾数位)
于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024,并且指数位是按补码的形式来划分的。
其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。
float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。
2).精度
float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。