日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
【揭秘】C語言類型轉(zhuǎn)換時發(fā)生了什么?

在C語言中,數(shù)據(jù)類型指的是用于聲明不同類型的變量或函數(shù)的一個廣泛的系統(tǒng),我們常用的算術(shù)類型包括兩種類型:整數(shù)類型和浮點類型。那么相互之間具體是怎么轉(zhuǎn)化的呢?

了解一下類型轉(zhuǎn)換

不同數(shù)據(jù)類型的存儲大小和值范圍是不一樣的,程序在初始化的時候就已經(jīng)設(shè)定了,例如: 

 
 
 
 
  1. int a = 9;  
  2. float b = 8.5; 

a,b占的字節(jié)大小不一樣,這個我們應(yīng)該都知道,在C語言中一個表達式允許不同類型的數(shù)據(jù)進行運算,例如: 

 
 
 
 
  1. int a = 9;  
  2. float b = 8.5,c;  
  3. c = a + b; 

因為計算機硬件在進行算術(shù)操作時,要求各操作數(shù)的類型具有相同的存儲位數(shù)以及一樣的存儲方式,所以就出現(xiàn)了類型轉(zhuǎn)換。

對于某些類型的轉(zhuǎn)換,編譯器可以隱式地自動進行,這種轉(zhuǎn)換稱為自動類型轉(zhuǎn)換;

而有些類型轉(zhuǎn)換需要程序員顯式指明,那么通常把這種轉(zhuǎn)換稱為強制類型轉(zhuǎn)換。

自動類型轉(zhuǎn)換

自動轉(zhuǎn)換是在源類型和目標類型兼容以及目標類型廣于源類型時發(fā)生一個類型到另一類的轉(zhuǎn)換。我們先來看一段代碼 

 
 
 
 
  1. //vs2019  
  2. //來源:技術(shù)讓夢想更偉大  
  3. //作者:李肖遙  
  4. #include   
  5. int main()  
  6. {  
  7.  //定義一個整型指針變量pPoint  
  8.  int* pPoint;  
  9.  //定義基本的數(shù)據(jù)的類型  
  10.  char c;  
  11.  short s;  
  12.  int i;  
  13.  long l;  
  14.  float f;  
  15.  double d;  
  16.  //將整型浮點型數(shù)據(jù)賦值給指針類型  
  17.  pPoint = c;  
  18.  pPoint = s;  
  19.  pPoint = i;  
  20.  pPoint = l;  
  21.  pPoint = f;  
  22.  pPoint = d;  
  23.  return 0;  

由于指針變量和整型、浮點這些數(shù)據(jù)型的類型是不能相互賦值的,編譯報錯輸出:

那么我們把同類型數(shù)據(jù)類型進行運算后賦值呢? 

 
 
 
 
  1. //vs2019  
  2. //來源:技術(shù)讓夢想更偉大  
  3. //作者:李肖遙  
  4. #include   
  5. int main()  
  6. {  
  7.  //定義一個整型指針變量pPoint  
  8.  int* pPoint;  
  9.  //定義基本的數(shù)據(jù)的類型  
  10.  char c;  
  11.  short s;  
  12.  int i;  
  13.  long l;  
  14.  float f;  
  15.  double d;  
  16.  //將整型浮點型數(shù)據(jù)運算之后賦值給指針類型  
  17.  pPoint = c + c;  
  18.  pPoint = s + s;  
  19.  pPoint = i + i;  
  20.  pPoint = l + l;  
  21.  pPoint = f + f;  
  22.  pPoint = d + d;  
  23.  return 0;  
  •  char同類型運算,結(jié)果是一個int類型。
  •  short同類型運算,結(jié)果是一個int類型。
  •  int同類型運算,結(jié)果是一個int類型。
  •  long同類型運算,結(jié)果是一個long類型。
  •  float同類型運算,結(jié)果是一個float類型。
  •  double同類型運算,結(jié)果是一個double類型。

如下圖所示:

同類型運算中:

  •  整型:比int小的,都會轉(zhuǎn)換成int,比int大的不變。
  •  浮點:不變。

那么我們把不同類型數(shù)據(jù)類型進行運算后賦值呢? 

 
 
 
 
  1. //vs2019  
  2. //來源:技術(shù)讓夢想更偉大  
  3. //作者:李肖遙  
  4. #include   
  5. int main()  
  6. {  
  7.  //定義一個整型指針變量pPoint  
  8.  int* pPoint; 
  9.  //定義基本的數(shù)據(jù)的類型  
  10.  char c;  
  11.  short s;  
  12.  int i;  
  13.  long l;  
  14.  float f;  
  15.  double d;  
  16.  //將整型浮點型數(shù)據(jù)混合運算賦值給指針類型  
  17.  pPoint = c + s;  // char + short = int  
  18.  pPoint = c + i;  // char + intint = int  
  19.  pPoint = c + l;  // char + long = int  
  20.  pPoint = c + f;  // char + float = long  
  21.  pPoint = c + d;  // char + double = float  
  22.  return 0;  
  •  char類型與short類型運算,結(jié)果是一個int類型。
  •  char類型與int類型運算,結(jié)果是一個int類型。
  •  char類型與long類型運算,結(jié)果是一個long類型。
  •  char類型與float類型運算,結(jié)果是一個float類型。
  •  char類型與double類型運算,結(jié)果是一個double類型。

結(jié)果如下圖所示:

 

可以得出在不同類型運算中:

  •  如果兩邊均比int小或等于int,那么結(jié)果為int。
  •  如果兩邊有比int大的,那么結(jié)果為比int大的類型。

我們得到結(jié)論如圖:

  •  整型類型級別從低到高依次為:

int -> unsigned int -> long -> unsigned long -> long long -> unsigned long long

  •  浮點型級別從低到高依次為:

float -> double

自動轉(zhuǎn)換規(guī)則:

  •  圖中橫向箭頭表示必須的轉(zhuǎn)換,如兩個float型數(shù)參加運算,雖然它們類型相同,但仍要先轉(zhuǎn)成double型再進行運算,結(jié)果亦為double型。
  •  圖中縱向箭頭表示當(dāng)運算符兩邊的運算數(shù)為不同類型時的轉(zhuǎn)換,如一個long 型數(shù)據(jù)與一個int型數(shù)據(jù)一起運算,需要先將int型數(shù)據(jù)轉(zhuǎn)換為long型, 然后兩者再進行運算,結(jié)果為long型。
  •  當(dāng)較高類型的數(shù)據(jù)轉(zhuǎn)換為較低類型時,則可能有些數(shù)據(jù)丟失。
  •  當(dāng)較低類型的數(shù)據(jù)轉(zhuǎn)換為較高類型時,一般只是形式上有所改變, 而不影響數(shù)據(jù)的實質(zhì)內(nèi)容。
  •  所有這些轉(zhuǎn)換都是由系統(tǒng)自動進行的,使用時你只需從中了解結(jié)果的類型即可。

強制類型轉(zhuǎn)換

強制類型轉(zhuǎn)換是通過類型轉(zhuǎn)換運算來實現(xiàn)的。其一般形式為: 

 
 
 
 
  1. (類型說明符) (表達式)  

其作用就是把表達式的運算結(jié)果強制轉(zhuǎn)換成類型說明符所表示的類型的值。 

 
 
 
 
  1. //vs2019  
  2. //來源:技術(shù)讓夢想更偉大  
  3. //作者:李肖遙  
  4. #include  
  5. #include  
  6. int main()  
  7. {  
  8.     float f,x=1.3,y=1.4;  
  9.     int i = 4,a,b;  
  10.     a = x + y;  
  11.     b = (int)(x+y);  
  12.     f = 10/i;  
  13.     printf("a=%d,b=%d,f=%f,x=%f,y=%f\n",a,b,f,x,y);  

運行結(jié)果如下:

我們從中可以看到,雖然x,y變強制轉(zhuǎn)換int型,但是最后輸出的值不變,強制類型轉(zhuǎn)換沒有影響x和y變量原本的類型。而上圖警告已經(jīng)說明了一切。

注意:在C語言中,對一個變量賦值的時候,這個變量初始定義的類型包含了兩層含義:

  1.  這個數(shù)據(jù)類型表示的內(nèi)存空間的大小。
  2.  編譯器把設(shè)定的數(shù)值放到這個內(nèi)存空間,是數(shù)據(jù)類型的存儲方式解析后存進去的。

總結(jié)強調(diào)一點

進行強制類型轉(zhuǎn)換后,內(nèi)存空間里面的內(nèi)容是不會發(fā)生改變的,改變的是運算時的臨時數(shù)據(jù)對象的類型,是你去讀取這個內(nèi)存空間時的解析方法。所以,一定要對這個數(shù)據(jù)類型的內(nèi)存空間和解析方式有一個清晰的認知。


當(dāng)前題目:【揭秘】C語言類型轉(zhuǎn)換時發(fā)生了什么?
網(wǎng)頁路徑:http://www.5511xx.com/article/djgecph.html