基本类型【C++】
简介
C++的基本类型有整型,浮点型,字符型,宽字符型,布尔型以及空类型。
原理
整型
C++的整型表示整数,整数给予不同的长度可以分为short,short int,int,long,long int,long long,long long int。
整型根据是否有符号可以分为有符号数和无符号数。
不同于JAVA等语言,C++标准没有规定每种基本类型的长度,即占多少字节,所以当前C++基本类型的长度和机器,OS,编译器都可能有关系,比如32位的windows操作系统,VC++编译器的int类型占用4个字节,而tuborC编译器是2个字节。
C++中基本类型和操作系统位数,编译器位数等都有关系,通过单个维度不一定能够确定类型的长度。
C++中整型的长度非固定的,所以我们需要通过sizeof来获取基本类型的长度。mac的Intel UHD架构下各种基本类型的长度如下:
分类 | 数据类型 | 长度(字节) | 数据范围 | 精度 |
---|---|---|---|---|
布尔型 | 布尔型 | 1 | {true,false} | |
整型 | short | 2 | -32768~+32767(-215~215-1) | |
short int | 2 | -32768~+32767(-215~215-1) | ||
int | 4 | -2147483648~+2147483647(-231~231-1) | ||
long | 8 | -2147483648~+2147483647(-231~231-1) | ||
long int | 8 | -2147483648~+2147483647(-231~231-1) | ||
long long | 8 | -9223372036854775808~9223372036854775807(-263~263-1) | ||
浮点型 | float | 4 | -3.4×1038~3.4×1038 | 7 |
double | 8 | -1.7×10308~1.7×10308 | ||
long double | 16 | -1.7×10308~1.7×10308 | ||
字符型 | char | 1 | -128~+127(-27~27-1) | |
wchar_t | 4 | |||
无符号 | unsigned short | 2 | 0~65535(0~216-1) | |
unsigned int | 4 | 0~4294967295(0~232-1) |
整型计算
溢出是指当对整型类型计算的过程中,结果超出了该整型类型可以表示的范围,对于无符号整型,溢出之后会根据2^(8*sizeof(type))作模运算。例如short的最大值是65535,加1之后会变为0。
#include <iostream>
using namespace std;
int main() {
unsigned short x;
x = 65535 + 1;
cout<<x;
}
对于有符号的整型,C++规范没有规定溢出之后的表现形式,但是大多数编译器的实现方式都是类似的。
#include <iostream>
using namespace std;
int main() {
short n = 32767;
n = n + 1;
cout << n;
}
上述程序中short已经是其可以表示的最大值,加一之后变成可以表示的最大负值-32768,从编码的角度可以分析,32767的编码是0x7fff,如果再加1,就变为了0x1000,也就是0x7fff。但是整型溢出之后不一定都是负数,主要取决为计算结果截断之后的最高位是1还是0,如果是1则为负数,反之则为正数。
整型的溢出问题会引发很多问题,例如循环不能结束等。
浮点型
浮点数在计算机内部以类似科学计数法的方式进行存储,不过是以二机制的形式。
浮点数主要分为三部分来存储:符号位、阶码部分(也有叫指数)和尾数部分,其中32位单精度float符号位占1bit,阶码占8bit,尾数部分占23bit;64位双精度double符号位占1bit,阶码占11bit,尾数部分占52bit。
单精度数的尾数用23位存储,加上默认的小数点前的1位1,2^(23+1) = 16777216。
因为 10^7 < 16777216 < 10^8,所以说单精度浮点数的有效位数是7位。
双精度的尾数用52位存储,2^(52+1) = 9007199254740992,
因为10^16 < 9007199254740992 < 10^17,所以双精度的有效位数是16位。
布尔型
C语言中没有bool型,只能用0和非0表示类似含义,C++定义了bool类型,bool类型有两种状态,true/false,true相当于1表示真命题,false相当于0表示假命题。
整型可以转换为bool型,转换结果为0返回false,否则返回true。
字符型
char一般是用1个字节存储,因为计算机内部都是二进制的方式存储,所以不能直接表示'A'或者'b',如果需要表示字符,必须采用编码来表示这些字符。计算机内部一般用ascii码表示英文字符。 上述表格是ascii码表,比如表示字符0,并不是在内存中使用0表示,而是使用00110000表示,所以字符0如果转换为整数类型,就会变成48。
空类型
在C++中,void代表空内容,常用于和指针的组合,void*。