c++ 基本数据类型总结

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。

  1. int能表示的最小负数-2147483648(0x80000000)

    内存地址内容
    0x100000000x00
    0x100000010x00
    0x100000020x00
    0x100000030x80
  2. int能表示的最大负数-1(0xFFFFFFFF)

    内存地址内容
    0x100000000xFF
    0x100000010xFF
    0x100000020xFF
    0x100000030xFF
  3. int能表示的最大正数2147483647(0x7FFFFFFF)

    内存地址内容
    0x100000000xFF
    0x100000010xFF
    0x100000020xFF
    0x100000030x7F
  4. int能表示的最小正数1(0x00000001)

    内存地址内容
    0x100000000x01
    0x100000010x00
    0x100000020x00
    0x100000030x00

###2.无符号整型
在有符号整型的前面加上unsigned即为相应的无符号整型,表格如下:

类型定义大小范围有无符号位
unsigned char无符号字符型1 Byte0 ~ 255无符号
unsigned short(int)无符号短整型2 Byte0 ~ 65535 (0 ~ 2 16 2^{16} 216-1)无符号
unsigned int无符号整形4 Byte0 ~ 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 Byte0 ~ 18446744073709551615(0 ~ 2 64 2^{64} 264-1)无符号

##二. 浮点型
浮点型也是使用非常频繁的数据类型,其存储方式和整型是不同的,这里以最常见的单精度浮点数(float)和双精度浮点数(double)来说明,参考IEEE浮点数算术标准(IEEE 754)。

###float(4 Byte):
由三部分组成

  1. 符号位(1 bit ):在第31位,表示该数的正负,0表示正,1表示负;
  2. 指数部分(8 bit ):在第30位第23位,表示指数的大小,采用移位存储的方式,存储的是原值+2^(8-1)-1即+127,指数范围是-127127,全为1保留;
  3. 尾数部分(23 bit):在第22位~第0位,表示尾数的大小;

###double (8 Byte):
由三部分组成

  1. 符号位(1 bit):在第63位,表示该数的正负,0表示正,1表示负;
  2. 指数部分(11 bit):在第62位第52位,表示指数的大小,采用移位存储的方式,存储的是原值+2^(11-1)-1即+1023,指数范围是-10231023,全为1保留;
  3. 尾数部分(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} 1045
负数只有符号位不同不再赘述。


###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} 10324
负数只有符号位不同不再赘述。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值