成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

【揭秘】C語言類型轉換時發生了什么?

開發 后端
在C語言中,數據類型指的是用于聲明不同類型的變量或函數的一個廣泛的系統,我們常用的算術類型包括兩種類型:整數類型和浮點類型。那么相互之間具體是怎么轉化的呢?來看看吧。

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

了解一下類型轉換

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

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

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

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

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

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

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

自動類型轉換

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

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

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

那么我們把同類型數據類型進行運算后賦值呢? 

  1. //vs2019  
  2. //來源:技術讓夢想更偉大  
  3. //作者:李肖遙  
  4. #include <stdio.h>  
  5. int main()  
  6.  
  7.  //定義一個整型指針變量pPoint  
  8.  int* pPoint;  
  9.  //定義基本的數據的類型  
  10.  char c;  
  11.  short s;  
  12.  int i;  
  13.  long l;  
  14.  float f;  
  15.  double d;  
  16.  //將整型浮點型數據運算之后賦值給指針類型  
  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同類型運算,結果是一個int類型。
  •  short同類型運算,結果是一個int類型。
  •  int同類型運算,結果是一個int類型。
  •  long同類型運算,結果是一個long類型。
  •  float同類型運算,結果是一個float類型。
  •  double同類型運算,結果是一個double類型。

如下圖所示:

同類型運算中:

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

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

  1. //vs2019  
  2. //來源:技術讓夢想更偉大  
  3. //作者:李肖遙  
  4. #include <stdio.h>  
  5. int main()  
  6.  
  7.  //定義一個整型指針變量pPoint  
  8.  int* pPoint; 
  9.  //定義基本的數據的類型  
  10.  char c;  
  11.  short s;  
  12.  int i;  
  13.  long l;  
  14.  float f;  
  15.  double d;  
  16.  //將整型浮點型數據混合運算賦值給指針類型  
  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類型運算,結果是一個int類型。
  •  char類型與int類型運算,結果是一個int類型。
  •  char類型與long類型運算,結果是一個long類型。
  •  char類型與float類型運算,結果是一個float類型。
  •  char類型與double類型運算,結果是一個double類型。

結果如下圖所示:

 

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

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

我們得到結論如圖:

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

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

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

float -> double

自動轉換規則:

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

強制類型轉換

強制類型轉換是通過類型轉換運算來實現的。其一般形式為: 

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

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

  1. //vs2019  
  2. //來源:技術讓夢想更偉大  
  3. //作者:李肖遙  
  4. #include<stdio.h>  
  5. #include<string.h>  
  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);  

運行結果如下:

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

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

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

總結強調一點

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

 

責任編輯:龐桂玉 來源: C語言與C++編程
相關推薦

2021-11-23 23:31:43

C語言數據類型系統

2019-11-12 14:41:41

Redis程序員Linux

2021-01-18 08:23:23

內存時底層CPU

2023-03-31 08:12:30

操作系統nanosleep信號

2021-06-30 06:02:38

MySQL SQL 語句數據庫

2020-08-17 12:47:07

Mozilla裁員瀏覽器

2019-08-26 09:35:25

命令ping抓包

2010-02-07 09:00:29

AndroidLinux Kerne

2021-04-11 10:40:16

Git軟件開發

2023-08-29 16:26:20

Linux命令行

2015-07-03 09:27:43

網絡閏秒

2020-09-01 11:40:01

HTTPJavaTCP

2019-09-16 17:16:29

Hadoop數據湖數據結構

2022-06-03 08:12:52

InnoDB插入MySQL

2021-12-16 15:58:48

Linux內存微軟

2017-09-06 16:20:51

2022-05-26 23:36:36

SQLMySQL數據

2022-05-31 13:58:09

MySQL查詢語句

2023-11-02 08:00:00

ClickHouse數據庫

2012-11-26 10:42:41

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩中文字幕 | 黄色一级片aaa | 成人国产精品一级毛片视频毛片 | 国产午夜精品一区二区三区四区 | 中文字幕一区二区三区四区五区 | 颜色网站在线观看 | 成人免费在线播放视频 | 九九热精品视频 | 国产中文字幕av | 亚洲国产精品久久人人爱 | 久久国内精品 | 色综合天天天天做夜夜夜夜做 | 精品美女视频在免费观看 | 97精品国产97久久久久久免费 | 日韩欧美国产精品一区 | 久久久免费在线观看 | 91免费视频| www.啪啪.com| 免费黄篇 | 欧美xxxⅹ性欧美大片 | 婷婷丁香激情 | 99精品视频在线观看 | 欧美一区二区三区在线视频 | 欧美日韩成人 | japanhd成人| 亚洲午夜精品视频 | 成年免费大片黄在线观看岛国 | 国产 日韩 欧美 制服 另类 | 日韩在线视频网址 | 在线观看黄色电影 | www.日日干 | 亚洲一区 中文字幕 | www久久av | 国产精品永久免费 | 中文字幕在线观看av | 福利视频一区 | 欧美一二区 | 国产高清不卡 | 一级大黄色片 | 翔田千里一区二区 | 久久激情网 |