基本类型【C++】

来自智得网
(重定向自基本类型(C++)
跳转至: 导航、​ 搜索

简介

CPlusPlus的类型

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。

ASCII码表

字符型

char一般是用1个字节存储,因为计算机内部都是二进制的方式存储,所以不能直接表示'A'或者'b',如果需要表示字符,必须采用编码来表示这些字符。计算机内部一般用ascii码表示英文字符。 上述表格是ascii码表,比如表示字符0,并不是在内存中使用0表示,而是使用00110000表示,所以字符0如果转换为整数类型,就会变成48。

空类型

在C++中,void代表空内容,常用于和指针的组合,void*。