说明:测试用例如若未说明则均用DEV5.11测试
文章来源均为自己测试总结,以实用为主,参考了众多博客
文章写的只是自己怕忘了又要测试的知识点;不对的地方还望指正
预定义数据类型
int:4个字节,一个字节8位,4*8=32; 所以取值范围为:-231——231-1=-2,147,483,648——2,147,483,647 ;
char;double;bool;float;void;指针型;
类型修饰符:
unsigned,signed, short, long
总计(dev 5.11测试):
{ short int (2字节) = short;
long int (4字节) = long = int;
long long int (8字节) = long long;double (8字节);
long double(16字节);(这些都有 unsigned和 signed 的区别) };
float (4字节);char (1字节);
long >= int >= short 1
float 和 double 都用数符,尾数,指数符,指数四部分表示(示例:-3.4*10(-38);数符:第一个负号;尾数:3.4;指数符:括号内的负号;指数38);
float、double、long double、的范围网上有,但是我无法测试,所以我不能肯定,在这就不列出了。
测试:
#include<stdio.h>
#include <iomanip>
#include<iostream>
using namespace std;
int main()
{
double D=1234567890.1234567890;
long double LD=12345.1234567890098;
float F=1.23456789;
cout<<"D:"<<setprecision(18)<<D<<endl;
cout<<"LD:"<<setprecision(18)<<LD<<endl;
cout<<"F:"<<setprecision(9)<<F<<endl;
return 0;
}
/*
DEV 5.11显示:
D:1234567890.12345672
LD:12345.1234567890097
F:1.23456788
VS2015显示:
D:1234567890.12345672
LD:12345.1234567890097
F:1.23456788
*/
所有的最后一位是随机的而且看来随机数种子都一样,所以十进制精度分别是double:17位;long double: 17位;float: 9位;
如果用十进制最大的数9做测试才在使用是最可靠,所以测试:
#include<stdio.h>
#include<time.h>
#include <iomanip>
#include<iostream>
using namespace std;
int main()
{
double D=-9999999999.999999;
long double LD=-99999.99999999999;
float F=-9.999999;
cout<<"D:"<<setprecision(18)<<D<<endl;
cout<<"LD:"<<setprecision(18)<<LD<<endl;
cout<<"F:"<<setprecision(9)<<F<<endl;
return 0;
}
/*
DEV 5.11显示:
D:-9999999999.99999809
LD:-99999.9999999999854
F:-9.99999905
可以观察到精确到的位数分别是:double:15位;long double 相同;float:7位;所以在这个范围内使用对应数据类型是ok的。
特殊的是:long double占内存16字节;double占内存8字节;精度却一样。
占位符总结:
%d:int
%ld:long
%f:float
%lf:double
%p:输出变量地址
%x/%X:输出十六进制数
%s:输出字符串
%o:无符号八进制整数
%u:无符号十进制整数
%e/%E:用科学记数法输出浮点数
自定义数据类型
数组;结构体(struct);类(class)
联合体(union):联合体与结构体有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在联合体中,各成员共享一段内存空间, 一个联合变量的长度等于各成员中最长的长度。
应该说明的是, 这里所谓的共享不是指把多个成员同时装入一个联合变量内, 而是指该联合变量可被赋予任一成员值,但每次只能赋一种值。
联合体的申明:
1.union perdata
{
int class;
char officae[10];
};
perdata a,b;
2.union perdata
{
int class;
char office[10];
}a,b;
3.union
{
int class;
char office[10];
}a,b
测例:
int main()
{
union ch{
int A;
char Z;
}a,b;
a.A='A';
b.Z='Z';
cout<<"a.A:"<<a.A<<endl;
cout<<"b.Z:"<<b.Z<<endl;
cout<<"a.Z:"<<a.Z<<endl;
cout<<"b.A:"<<b.A<<endl;
return 0;
}
/*
输出结果:
a.A:65 整型 A
b.Z:Z char型 Z
a.Z:A char型 A
b.A:90 整型 Z
说明:赋值的时候已经确定值了,在使用同一个对象的不同的数据类型的时候,数据值不变,但还会改变数据类型。
*/
联合体就相当于一个可变的数据类型。
枚举(enum):C/C++语言可以使用#define和const创建符号常量,而使用enum工具不仅能够创建符号常量,还能定义新的数据类型,但是必须按照一定的规则进行。
例:
enum enumType {Monday, Tuesday, Wednesday, Thursday, Friday,Saturday, Sunday};
未定义枚举量的值的默认是从0开始递增,若定义
enum enumType {Monday = 1, Tuesday, Wednesday = 1, Thursday, Friday,Saturday, Sunday};
则Monday = 1, Tuesday = 2, Wednesday =1, Thursday = 2, Friday = 3, Saturday = 4, Sunday = 5
测试:
int main()
{
enum enumType { Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };
enumType Weekday;
cout<<Monday<<Tuesday<< Wednesday<< Thursday<< Friday<<Saturday<< Sunday<<endl;
// Monday = 1; 错误,不能赋值, 所以 Monday++ 也不可以了;
cout<<enumType(0)<<enumType(1)<<enumType(2)<<enumType(3)<<enumType(4)<<enumType(5)<<enumType(6)<<endl;
int a = Monday + 1;
if (Monday == 0)
cout<<"Monday:"<<Monday<<endl;
// Monday = Wednesday; 错误,不能赋值;
cout<<"a:"<<a<<endl;
// enum Week{Monday = 1, Tuesday, Wednesday = 1, Thursday, Friday, Saturday, Sunday}; 错误,不能重复定义里面的每一元
return 0;
}
/*
输出结果:
0123456
0123456
Monday: 0
a: 1
*/
C标准规定,并没有做具体规定,具体实现根据编译器可能不同 ↩︎