C++ 基本数据类型总结
文章目录
c++定义了一套包括 算术类型和**空类型(void)**在内的基本数据类型,这里只讨论算术类型。
##一. 整型
###1.有符号整型
直接定义short,int,long,long long等类型时默认都为有符号整形,表格如下:
类型 | 定义 | 大小 | 范围 | 有无符号位 |
---|---|---|---|---|
char | 字符型 | 1 Byte | -128~127 | 有符号(使用GCC编译器) |
short(int) | 短整型 | 2 Byte | -32768~32767 (- 2 15 2^{15} 215 ~ 2 15 2^{15} 215-1) | 有符号 |
int | 整形 | 4 Byte | -2147483648 ~ 2147483647 (- 2 31 2^{31} 231 ~ 2 31 2^{31} 231-1) | 有符号 |
long | 长整形 | 4 Byte(32bit系统) 或 8 byte(64bit系统) | 参考int和long long的范围 | 有符号 |
long long (c++11新定义) | 长整形 | 8 Byte | -9223372036854775808 ~ 9223372036854775807 (- 2 63 2^{63} 263 ~ 2 63 2^{63} 263-1) | 有符号 |
注意int的取值范围只比 -2.1*10^9 ~ 2.1*10^9 略宽;而long long只比-10^19 ~ 10^19略窄,计算时要考虑到数值的大小范围选择合适的数据类型。
bool类型是特殊的整形,其占一个字节,只有0(false)和1(true)两种取值。
有符号整型以int型为例说明其在内存中的存储方式:
有符号数实际上存储的是每个数的补码,正数的原码等于其补码,负数的原码和补码相加应该等于模,对于int来说,其模为
2
31
2^{31}
231 = 2147483648。另外,规定正0和负0都为0x00000000。
-
int能表示的最小负数-2147483648(0x80000000)
内存地址 内容 0x10000000 0x00 0x10000001 0x00 0x10000002 0x00 0x10000003 0x80 -
int能表示的最大负数-1(0xFFFFFFFF)
内存地址 内容 0x10000000 0xFF 0x10000001 0xFF 0x10000002 0xFF 0x10000003 0xFF -
int能表示的最大正数2147483647(0x7FFFFFFF)
内存地址 内容 0x10000000 0xFF 0x10000001 0xFF 0x10000002 0xFF 0x10000003 0x7F -
int能表示的最小正数1(0x00000001)
内存地址 内容 0x10000000 0x01 0x10000001 0x00 0x10000002 0x00 0x10000003 0x00
###2.无符号整型
在有符号整型的前面加上unsigned即为相应的无符号整型,表格如下:
类型 | 定义 | 大小 | 范围 | 有无符号位 |
---|---|---|---|---|
unsigned char | 无符号字符型 | 1 Byte | 0 ~ 255 | 无符号 |
unsigned short(int) | 无符号短整型 | 2 Byte | 0 ~ 65535 (0 ~ 2 16 2^{16} 216-1) | 无符号 |
unsigned int | 无符号整形 | 4 Byte | 0 ~ 4294967295 (0 ~ 2 32 2^{32} 232-1) | 无符号 |
unsigned long | 无符号长整形 | 4 Byte(32bit系统) 或 8 Byte(64bit系统) | 参考int和long long的范围 | 无符号 |
unsigned long long (c++11新定义) | 无符号长整形 | 8 Byte | 0 ~ 18446744073709551615(0 ~ 2 64 2^{64} 264-1) | 无符号 |
##二. 浮点型
浮点型也是使用非常频繁的数据类型,其存储方式和整型是不同的,这里以最常见的单精度浮点数(float)和双精度浮点数(double)来说明,参考IEEE浮点数算术标准(IEEE 754)。
###float(4 Byte):
由三部分组成
- 符号位(1 bit ):在第31位,表示该数的正负,0表示正,1表示负;
- 指数部分(8 bit ):在第30位第23位,表示指数的大小,采用移位存储的方式,存储的是原值+2^(8-1)-1即+127,指数范围是-127127,全为1保留;
- 尾数部分(23 bit):在第22位~第0位,表示尾数的大小;
###double (8 Byte):
由三部分组成
- 符号位(1 bit):在第63位,表示该数的正负,0表示正,1表示负;
- 指数部分(11 bit):在第62位第52位,表示指数的大小,采用移位存储的方式,存储的是原值+2^(11-1)-1即+1023,指数范围是-10231023,全为1保留;
- 尾数部分(52 bit):在第51位~第0位,表示尾数的大小;
注1:这里指数部分和尾数部分存储的都是换算成2进制后的数,指数部分前面默认有一个1。
注2 : 数值 0 表示为全 0;
###例子:
下面的十六进制都是低位地址在前
10.5的float表示:10.5换算成二进制表示为1010.1,将其右移3位得到1.0101,那么其指数部分就为3+127=130,表示为2进制就是10000010,尾数部分省略掉前面的整数部分1,为0101 0000000000000000000,因为符号位为0,所以用十六进制表示就是00 00 28 41;
-10.25的double表示:10.25换算成二进制为1010.01,将其右移3位得到1.01001,那么其指数部分就为3+1023=1026,表示成2进制为10000000010,尾数部分省略掉前面的整数部分1,为01001 000······0(共52位),符号位为1,所以最终以十六进制表示为00 00 00 00 00 80 24 C0;
注:如果小数部分无法用二进制小数精确表示,那么只能在精度范围内尽力的表示它,如0.1的double表示为9A 99 99 99 99 99 B9 3F 。
###float范围和精度:
因为float用23位二进制数表示尾数,
l
o
g
10
(
2
23
)
log_{10}(2^{23})
log10(223)约为6.9237,所以float的有效数字为6-7位,保证精确的只有6位;
float能够表示的最大正数为FF FF 7F 7F ,约为3.402823*
1
0
38
10^{38}
1038;
float能够表示的最小正数为01 00 00 00,约为1.401298*
1
0
−
45
10^{-45}
10−45;
负数只有符号位不同不再赘述。
###double范围和精度
因为double用52位二进制数表示尾数,
l
o
g
10
(
2
52
)
log_{10}(2^{52})
log10(252)约为15.6536,所以double的有效数字为15-16位,保证精确的只有15位;
double能够表示的最大正数为FF FF FF FF FF FF EF 7F ,约为1.797693*
1
0
308
10^{308}
10308;
double能够表示的最小正数为01 00 00 00 00 00 00 00 ,约为4.940656*
1
0
−
324
10^{-324}
10−324;
负数只有符号位不同不再赘述。