當前位置:首頁 » 編程語言 » c語言隱式類型轉換
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言隱式類型轉換

發布時間: 2022-01-31 20:11:49

1. c語言指針隱式類型轉化的問題

addr = p_addr;
左邊是int,右邊是int*,存在一個隱式轉換。

2. c語言隱性類型轉換規則

會出現負數變大正數(【這是實現定義的】!)。其中涉及一個補碼反碼的問題,你可以自行去度娘參考下。

3. C語言中,數據類型的隱式轉換與顯式轉換分別是個什麼

顯式轉換, 就是強制轉換. 在被轉換的表達式前加(類型).
比如
(float)5
就是把5顯式轉換成float類型.
隱式轉換, 就是不需要加強制轉換, 系統會自動做這個操作.
比如
double k;
k=10;
10是int型, 不需要顯式轉換, 系統自動會把它轉為10.0

4. C語言數據類型的轉換

讓我來說說這個問題吧。
一.自動轉換
自動轉換遵循以下規則:
1) 若參與運算量的類型不同,則先轉換成同一類型,然後進行運算。
2) 轉換按數據長度增加的方向進行,以保證精度不降低。如int型和long型運算時,先把int量轉成long型後再進行運算。
a.若兩種類型的位元組數不同,轉換成位元組數高的類型
b.若兩種類型的位元組數相同,且一種有符號,一種無符號,則轉換成無符號類型
3)所有的浮點運算都是以雙精度進行的,即使僅含float單精度量運算的表達式,也要先轉換成double型,再作運算。
4)char型和short型參與運算時,必須先轉換成int型。
5)在賦值運算中,賦值號兩邊量的數據類型不同時,賦值號右邊量的類型將轉換為左邊量的類型。如果右邊量的數據類型長度左邊長時,將丟失一部分數據,這樣會降低精度,丟失的部分按四捨五入向前舍入。
二.隱式轉換
隱式類型轉換分三種,即算術轉換、賦值轉換和輸出轉換。
1.算術轉換
進行算術運算(加、減、乘、除、取余以及符號運算)時,不同類型數招必須轉換成同一類型的數據才能運算,算術轉換原則為:
在進行運算時,以表達式中最長類型為主,將其他類型位據均轉換成該類型,如:
(1)若運算數中有double型或float型,則其他類型數據均轉換成double類型進行運算。
(2)若運算數中最長的類型為long型.則其他類型數均轉換成long型數。
(3)若運算數中最長類型為int型,則char型也轉換成int型進行運算。算術轉換是在運算過程中自動完成的。
2.賦值轉換
進行賦值操作時,賦值運算符右邊的數據類型必須轉換成賦值號左邊的類型,若右邊的數據類型的長度大於左邊,則要進行截斷或舍入操作。
下面用一實例說明:
char ch;
int i,result;
float f;
double d;
result=ch/i+(f*d-i);
(1)首先計算 ch/i,ch → int型,ch/i → int型。
(2)接著計算 f*d-i,由於最長型為double型,故f→double型,i→double型,f*d-i→double型。
(3)(ch/i) 和(f*d-i)進行加運算,由於f*d-i為double型,故ch/i→double型,ch/i+(f*d-i)→double型。
(4)由於result為int型,故ch/i+(f*d-i)→double→int,即進行截斷與舍入,最後取值為整型。
3.輸出轉換
在程序中將數據用printf函數以指定格式輸出時,當要輸出的鹽據類型與輸出格式不符時,便自動進行類型轉換,如一個long型數據用整型格式(%d)輸出時,則相當於將long型轉換成整型(int)數據輸出;一個字元(char)型數據用整型格式輸出時,相當於將char型轉換成int型輸出。
注意:較長型數據轉換成短型數據輸出時,其值不能超出短型數據允許的值范圍,否則轉換時將出錯。如:
long a=80000;
printf("%d",a);
運行結果為14464,因為int型允許的最大值為32767,80000超出此值,故結果取以32768為模的余數,即進行如下取余運算:
(80000-32768)-32768=14464;
輸出的數據類型與輸出格式不符時常常發生錯誤,如:
int d=9;
printf("%f",d);

float c=3.2;
printf("%d",c);
將產生錯誤的結果。
同一句語句或表達式如果使用了多種類型的變數和常量(類型混用),C 會自動把它們轉換成同一種類型。以下是自動類型轉換的基本規則:
1. 在表達式中,char 和 short 類型的值,無論有符號還是無符號,都會自動轉換成 int 或者 unsigned int(如果 short 的大小和 int 一樣,unsigned short 的表示範圍就大於 int,在這種情況下,unsigned short 被轉換成 unsigned int)。因為它們被轉換成表示範圍更大的類型,故而把這種轉換稱為「升級(promotion)」。
2. 按照從高到低的順序給各種數據類型分等級,依次為:long double, double, float, unsigned long long, long long, unsigned long, long, unsigned int 和 int。這里有一個小小的例外,如果 long 和 int 大小相同,則 unsigned int 的等級應位於 long 之上。char 和 short 並沒有出現於這個等級列表,是因為它們應該已經被升級成了 int 或者 unsigned int。
3. 在任何涉及兩種數據類型的操作中,它們之間等級較低的類型會被轉換成等級較高的類型。
4. 在賦值語句中,= 右邊的值在賦予 = 左邊的變數之前,首先要將右邊的值的數據類型轉換成左邊變數的類型。也就是說,左邊變數是什麼數據類型,右邊的值就要轉換成什麼數據類型的值。這個過程可能導致右邊的值的類型升級,也可能導致其類型降級(demotion)。所謂「降級」,是指等級較高的類型被轉換成等級較低的類型。
5. 作為參數傳遞給函數時,char 和 short 會被轉換成 int,float 會被轉換成 double。使用函數原型可以避免這種自動升級。
三.強制轉換
強制類型轉換是通過類型轉換運算來實現的。其一般形式為:(類型說明符)(表達式)其功能是把表達式的運算結果強制轉換成類型說明符所表示的類型。自動轉換是在源類型和目標類型兼容以及目標類型廣於源類型時發生一個類型到另一類的轉換。例如: (float) a 把a轉換為實型,(int)(x+y) 把x+y的結果轉換為整型。在使用強制轉換時應注意以下問題:

1.類型說明符和表達式都必須加括弧(單個變數可以不加括弧),如把(int)(x+y)寫成(int)x+y則成了把x轉換成int型之後再與y相加了。

2.無論是強制轉換或是自動轉換,都只是為了本次運算的需要而對變數的數據長度進行的臨時性轉換,而不改變數據說明時對該變數定義的類型。

例1:

main()

{

float f=5.75;

printf("(int)f=%d,f=%f\n",(int)f,f);

}

f<--5.75

將float f強制轉換成int f float f=5.75;printf("(int)f=%d,f=%f\n",(int)f,f); 本例表明,f雖強制轉為int型,但只在運算中起作用, 是臨時的,而f本身的類型並不改變。因此,(int)f的值為 5(刪去了小數)而f的值仍為5.75。

5. C語言,C++中顯式轉換和隱式轉換的區別

顯式是強制轉換,而隱式是編譯器自動轉換的,一般同一數據類型(如byte,int,float,double),由低級轉為高級為隱式(如int轉為float或double),而高級轉為低級為強制類型轉換,即顯式轉換,須用戶在代碼中寫的(如float轉為int)。
隱式數據類型轉換是有編譯器完成的,例如:
char a = 'a';
int x = a;

顯示需要編程過程中強制轉換,例如
int a = 10;
double x = (double)a;

6. 關於C語言中的隱式類型轉換

就像1樓說的一樣,雖然有float型參與運算,但是c始終都是int類型的,
a/b是個雙精度的浮點型,但是將其賦值給c,將會變成整型,然後你看看用%d試試

7. 何謂隱式類型轉換其轉換規則如何

隱式類型轉換所謂隱式類型轉換就是在編譯時由編譯程序按照一定規則自動完成,而不需人為干預。因此,在表達式中如果有不同類型的數據參與同一運算時,編譯器就在編譯時自動按照規定的規則將其轉換為相同的數據類型。 C語言規定的轉換規則是由低級向高級轉換。

8. 在c語言隱式類型轉換中,為什麼輸入一個int函數和一個float函數,經過運算後得出的是doubl

  1. 在表達式中,所有的float類型都轉換為double型以提高運算精度。

  2. 當整型數據和雙精度數據進行運算時,C先將整型數據轉換成雙精度型數據,再進行運算,結果為雙精度類型數據


9. C語言 數值類型隱式轉換的規則。幫忙看一下我理解的對嗎。

這個問題問題的好,是一個復雜的問題,只能簡單的按你的理解一起討論一下。有不同觀點
可以來 0x30網路貼吧直接發貼共同交流,網路知道不常在,可能會不能及時收到追問提示。

1、整數轉整數時, 將優先存放數據位的低位, 溢出的則拋棄. //未必
原因:有兩種情況小位元組的整數轉大位元組的整數,要看小位元組是有符號數還是無符號數。比如下面的代碼:
unsigned char ux = 0x80;
char x = 128;
int i = ux; //此時x為無符號的char,所以i的值為128
i = x; //此時x為有符號char,所以i的值為 -128
本質是有符號使用符號擴展,無符號使用0擴展。
大位元組的整數轉小位元組的整數,要看cpu的存儲順序。你說的只是intel平台上的,它是小端機,比如:
int i = 0x12345678;
char x = i;//在little endian的機器上,它的值是0x78如你所說,但是在big endian的機器上它將是0x12。

2、浮點轉整數時, 將優先存放數據位的高位(小數點之前的位), 小數點後丟棄.//可以設置丟棄方式
原因:浮點數轉整型數時,C/C++都是直接舍棄掉小數部分。比如
int i;
for (double f=1.0; (2.0 -f) >=FLT_EPSILON ; f+=0.1) {
i = f;
printf("%d\n", i); //不管你是1.0 還是1.9轉成整數都是1
}
但是這種舍棄規則是可以修改的,方法就是調用math.h中聲明的的floor()或者ceil(),前者是下行整型化,後者是上行整型化,換句話說,比如1.5floor(1.5) 它的值就是1
(下行整型化),ceil(1.5)就是2.0,這是上行整行化。
3、浮點轉浮點時, 將優先存放數據位的高位, 溢出的則拋棄.』(高精度轉低精度時將會進行四捨五入)

高精度轉低精度,C/C++標准未進行說明,有實現決定,vc++中是四捨五入。這種轉換,實際上沒有任何意義,因為數據丟失了。
低精度轉高精度,這個直接提升就好了。
4、整數轉浮點時, 將優先存放數據的低位, 溢出的則拋棄.
這個C/C++標准中也未進行說明,有實現決定。