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

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

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

了解一下類型轉換

[[436445]]

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

  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.  //定義一個整型指針變量pPoint 
  7.  int* pPoint; 
  8.  
  9.  //定義基本的數據的類型 
  10.  char c; 
  11.  short s; 
  12.  int i; 
  13.  long l; 
  14.  float f; 
  15.  double d; 
  16.  
  17.  //將整型浮點型數據賦值給指針類型 
  18.  pPoint = c; 
  19.  pPoint = s; 
  20.  pPoint = i; 
  21.  pPoint = l; 
  22.  pPoint = f; 
  23.  pPoint = d; 
  24.   
  25.  return 0; 

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

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

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

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

如下圖所示:

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

同類型運算中:

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

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

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

結果如下圖所示:

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

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

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

我們得到結論如圖:

「揭秘」C語言類型轉換時發生了什么?
  • 整型類型級別從低到高依次為:

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

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

float -> double

自動轉換規則:

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

強制類型轉換

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

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

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

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

運行結果如下:

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

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

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

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

總結強調一點

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

 

責任編輯:華軒 來源: 今日頭條
相關推薦

2020-08-20 11:50:31

語言類型轉換代碼

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技術棧公眾號

主站蜘蛛池模板: 精品国产乱码一区二区三区a | 国产精品亚洲成在人线 | 久久lu | 欧美激情精品久久久久久变态 | 中国大陆高清aⅴ毛片 | 国产免费色 | 国产精品1区2区 | 国产99久久精品一区二区永久免费 | 亚洲欧洲视频 | 美女在线观看av | 一区中文字幕 | 日韩一区精品 | 日p视频免费看 | 欧美高清dvd | 国产极品车模吞精高潮呻吟 | 国产免费一区二区三区最新6 | 欧美视频中文字幕 | 日韩色综合 | 高清免费在线 | 中文字幕av一区 | 成人国产一区二区三区精品麻豆 | 人人叉 | 亚洲综合区| 亚洲欧美日韩在线不卡 | 毛片免费在线观看 | 999久久久 | 99亚洲国产精品 | 亚洲一区中文 | 欧美日韩中文字幕 | 人人99| 亚洲精品成人在线 | 欧美日韩国产一区二区 | 狠狠干av| 欧美日韩精品一区二区三区蜜桃 | 日韩在线免费视频 | 国产一区二区精品在线观看 | 午夜男人天堂 | 成人高潮片免费视频欧美 | 亚洲一区综合 | 成人h视频 | 久久久久久久久久久久亚洲 |