C/C++ 深入瞭解數據類型

說明:測試用例如若未說明則均用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
*/

  1. C標準規定,並沒有做具體規定,具體實現根據編譯器可能不同 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章