說明:測試用例如若未說明則均用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標準規定,並沒有做具體規定,具體實現根據編譯器可能不同 ↩︎