在C語言中,數據類型指的是用於聲明不同類型的變量或函數的一個廣泛的系統,我們常用的算術類型包括兩種類型:整數類型和浮點類型。那麼相互之間具體是怎麼轉化的呢?
了解一下類型轉換
不同數據類型的存儲大小和值範圍是不一樣的,程序在初始化的時候就已經設定了,例如:
int a = 9;
float b = 8.5;
a,b佔的字節大小不一樣,這個我們應該都知道,在C語言中一個表達式允許不同類型的數據進行運算,例如:
int a = 9;
float b = 8.5,c;
c = a + b;
因為計算機硬體在進行算術操作時,要求各操作數的類型具有相同的存儲位數以及一樣的存儲方式,所以就出現了類型轉換。
對於某些類型的轉換,編譯器可以隱式地自動進行,這種轉換稱為自動類型轉換;
而有些類型轉換需要程式設計師顯式指明,那麼通常把這種轉換稱為強制類型轉換。
自動轉換是在源類型和目標類型兼容以及目標類型廣於源類型時發生一個類型到另一類的轉換。我們先來看一段代碼
//vs2019
//來源:技術讓夢想更偉大
//作者:李肖遙
#include <stdio.h>
int main()
{
//定義一個整型指針變量pPoint
int* pPoint;
//定義基本的數據的類型
char c;
short s;
int i;
long l;
float f;
double d;
//將整型浮點型數據賦值給指針類型
pPoint = c;
pPoint = s;
pPoint = i;
pPoint = l;
pPoint = f;
pPoint = d;
return 0;
}
由於指針變量和整型、浮點這些數據型的類型是不能相互賦值的,編譯報錯輸出:
那麼我們把同類型數據類型進行運算後賦值呢?
//vs2019
//來源:技術讓夢想更偉大
//作者:李肖遙
#include <stdio.h>
int main()
{
//定義一個整型指針變量pPoint
int* pPoint;
//定義基本的數據的類型
char c;
short s;
int i;
long l;
float f;
double d;
//將整型浮點型數據運算之後賦值給指針類型
pPoint = c + c;
pPoint = s + s;
pPoint = i + i;
pPoint = l + l;
pPoint = f + f;
pPoint = d + d;
return 0;
}
如下圖所示:
同類型運算中:
那麼我們把不同類型數據類型進行運算後賦值呢?
//vs2019
//來源:技術讓夢想更偉大
//作者:李肖遙
#include <stdio.h>
int main()
{
//定義一個整型指針變量pPoint
int* pPoint;
//定義基本的數據的類型
char c;
short s;
int i;
long l;
float f;
double d;
//將整型浮點型數據混合運算賦值給指針類型
pPoint = c + s; // char + short = int
pPoint = c + i; // char + int = int
pPoint = c + l; // char + long = int
pPoint = c + f; // char + float = long
pPoint = c + d; // char + double = float
return 0;
}
結果如下圖所示:
可以得出在不同類型運算中:
我們得到結論如圖:
int -> unsigned int -> long -> unsigned long -> long long -> unsigned long long
float -> double
自動轉換規則:
強制類型轉換是通過類型轉換運算來實現的。其一般形式為:
(類型說明符) (表達式)
其作用就是把表達式的運算結果強制轉換成類型說明符所表示的類型的值。
//vs2019
//來源:技術讓夢想更偉大
//作者:李肖遙
#include<stdio.h>
#include<string.h>
int main()
{
float f,x=1.3,y=1.4;
int i = 4,a,b;
a = x + y;
b = (int)(x+y);
f = 10/i;
printf("a=%d,b=%d,f=%f,x=%f,y=%f\n",a,b,f,x,y);
}
運行結果如下:
我們從中可以看到,雖然x,y變強制轉換int型,但是最後輸出的值不變,強制類型轉換沒有影響x和y變量原本的類型。而上圖警告已經說明了一切。
注意:在C語言中,對一個變量賦值的時候,這個變量初始定義的類型包含了兩層含義:
進行強制類型轉換後,內存空間裡面的內容是不會發生改變的,改變的是運算時的臨時數據對象的類型,是你去讀取這個內存空間時的解析方法。所以,一定要對這個數據類型的內存空間和解析方式有一個清晰的認知。