C++定义了表示整数、浮点数、字符和布尔值以及void的基本数据类型,算术类型的存储空间与机器有关,因为机器位数不同,这些类型所能表示的最大(最小)值也因机器的不同而有所不同。
类型+含义+最小存储空间如下:
bool 布尔型
char 字符型 8位
wchar_t 宽字符型 16位
short 短整型 16位
int 整型 16位
long 长整型 32位
float 单精度浮点型 6为有效数字
double 双精度浮点型 16位有效数字
long double 扩展精度浮点型 16位有效数字
具体分析如下:
1、整数
一般认为short ,int ,long为表示整数的类型;一般,short类型为半个机器字长,int类型为一个机器字长,而long类型定义为不小于int类型,long long类型为8个字节。
使用sizeof来看一下他们的结果:
cout << sizeof(short) << endl; cout << sizeof(int) << endl; cout << sizeof(long) << endl; cout << sizeof(long long) << endl;在当前电脑编译器下为: 2,4,4,8
因此,在当前编译器下,使用int和long是没有区别的。在使用时尽可能使用最合适的类型,short的使用可以减少存储空间,int的使用可以加快程序处理速度(一个机器字长),long long的使用是在int范围不足以表示时使用
unsigned int与int——在一起操作时,都会转换为无符号数,如下:
unsigned int a = 100; signed int b = -130; if (a < b) printf("%u", b);
输出为: 4294967166 。在运算中,无符号数优先级要高于有符号数。
2、浮点数
浮点数常用的为 float,double与long double;具体使用需要根据编译器处理结果而定。
使用sizeof来看一下他们的结果:
cout << sizeof(float) << endl; cout << sizeof(double) << endl; cout << sizeof(long double) << endl;在当前电脑编译器下为: 4,8,8
float与double的区别在于精度的不同,double精度高,有效位为16位,float精度为7位。
例如,在如下的example中的输出:
float l1 = 100.22222222222; double l2 = 100.222222222222; printf("%0.11f\n", l1);//输出为100.22222137451 printf("%0.11f\n", l2);//输出为100.22222222222在高位机的某些处理器中, long double的大小可能为16字节,这个时候使用long double将得到更准确的精度。
在程序中,精度越高,处理器处理数据花费时间越多,程序执行速度越慢。
3、字符
字符有 char、wchar_t、char16_t、char32_t ;这些类型与字符集有关系,涉及unicode,utf-8,utf-16等,可通过一下链接来了解字符的出现及意义:
@于洋的经典论述 ————讲述了什么是字符集以及字符集是如何出现的,使用字符集的必要性
4、bool值
判断true与false的类型,可以认为ture就是1,false就是0.
cout << false << endl; //输出为0 cout << true << endl; //输出为1
5、void类型
void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。
使用void的意义在于:对函数返回的限定;对函数参数的限定
1、对于有些编辑器来说,不定义函数返回值是可编译的。使用void可增强代码的严谨性与可读性
test(){ int a=10; return a; }
在某些编译器下是可编译的... ... ;而 test(2)在某些编译器下是可执行的。 因此 int test(void) 的定义是必要的
2、注意void指针
按照ANSI标准,不能对void指针进行算法操作,即void * pvoid; pvoid++;是不合法的。
但是GNU标准则不一样,它指定void *的算法操作与char *一致。因此,使用 void *pvoid;(char*)pvoid++来实现兼容是必要的
void在c语言库中的经典使用:
void *memcpy(void *dest, const void *src, size_t n); //内存复制函数
任何类型的指针都可以传入memcpy中,而memcpy只是负责把src那一块的存储复制到dest区域中,复制本身与数据类型无关