① 關於c語言類型自動轉換的
#include
<math.h>
例如
sin(x);
sin
的參數
應當是
double型,計算結果
返回
也是
double型。
如果
你的參數
是
float類型:
float
a=0.4,
r;
r
=
sin(a);
sin
計算
時,a
被提升為double類型,
計算結果
也是
double型,
而
你的
r
是
float
型,
計算結果
再從
double
轉
float
。
float
a=0.4;
double
r;
r
=
sin(a);
sin
計算
時,a
被提升為double類型,
計算結果
也是
double型,賦給r
==
如果參數本來就要求是
float
型,你也給了
float
型,當然不會
"提升"到
double.
==
表達式計算中,float
與
double
混合計算,則
float
會
"提升"到
double,以保證
精度。
② C語言類型轉換
第一個數廳緩輸出為 177776
因為int為2位元組 所以 -2在計算機中以補碼存儲 為1 111 111 111 111 110
轉化為八進制 177776
第二個輸出為 177776 原因一樣
第三個 結果為177777 x/2=-1 -1補碼為1 111 111 111 111 111
轉化為八進制 177777
第四個 結果為 77777 因為 x1/伏毀2 為unsigned 所以最薯模高位為0
所以轉化過來就是77777
③ printf在c語言中什麼意思
向屏幕輸出。
int i=123;
printf("%d",i); //表示以十進制整數格式輸出i的值。
printf()函數是格式化輸出函數, 一般用於向標准輸出設備按規定格式輸出信息。
printf()函數的調用格式為: printf("<格式化字元串>", <參量表>)。
格式輸出,它是c語言中產生格式化輸出的函數(在 stdio.h 中定義)。用於向終端(顯示器、控制台等)輸出字元。格式控制由要輸出的文字和數據格式說明組成。要輸出的的文字除了可以使用字母、數字、空格和一些數字元號以外,還可以使用一些轉義字元表示特殊的含義。
參數列表
在輸出時,普通字元將原樣不動地復制到標准輸出,轉換說明並不直接輸出而是用於控制 printf 中參數的轉換和列印。每個轉換說明都由一個百分號字元(%)開始,以轉換說明結束,從而說明輸出數據的類型、寬度、精度等。
printf 的格式控制字元串 format 中的轉換說明組成如下,其中的部分是可選的:%[flags][width][.precision][length]specifier,即:%[標志][最小寬度][.精度][類型長度]說明符 。轉換說明詳解見下文。
附加參數 -- 根據不同的 format 字元串,函數可能需要一系列的附加參數,每個參數包含了一個要被插入的值,替換了 format 參數中指定的每個 % 標簽。參數的個數應與 % 標簽的個數相同。
以上內容參考:網路-printf
④ 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。
⑤ c語言數據類型轉換
這么說豎晌吧,area被你定位了int型,但是你又要讓他輸出時按浮點型來
最後area的值為12,二進製表示0000 0000 0000 0000 0000 0000 0000 1100,按照浮點型數的存儲規定,這個值就是0.0,計算機執行沒有問物滲題,有問題的是你的代碼
正確的代碼應該是
#include<stdio.h>
int main()
{
double pi=3.1415,r=2.5,area;
area=pi*r*r;
printf("area=%f\罩纖脊n",area);
return 0;
}
⑥ c語言里怎麼使用printf
printf()函數的調用格式為: printf("<格式化字元串>", <參量表>)。
其中格式化字元串包括兩部分內容:一部分是正常字元,這些字元將按原樣輸出; 另一部分是格式化規定字元,以"%"開始,後跟一個或幾個規定字元,用來確定輸出內容格式。
參量表是需要輸出的一系列參數,其個數必須與格式化字元串所說明的輸出參數個數一樣多, 各參數之間用","分開, 且順序一一對應,否則將會出現意想不到的錯誤。
比如:
inta=1234;
printf("a=%d ",a);
輸出結果為a=1234。
scanf()是C語言中的一個輸入函數。與printf函數一樣,都被聲明在頭文件stdio.h里,因此在使用scanf函數時要加上#include <stdio.h>。
intscanf(constchar*restrictformat,...);
函數scanf() 是從標准輸入流stdin (標准輸入設備,一般指向鍵盤)中讀內容的通用子程序,可以說明的格式讀入多個字元,並保存在對應地址的變數中。
如:
scanf("%d%d",&a,&b);
函數返回值為int型,如果a和b都被成功讀入,那麼scanf的返回值就是2。
(6)c語言類型轉換printf擴展閱讀:
printf函數使用注意事項
1.域寬問題
%d:按整型數據的實際長度輸出。
如果想輸出指定寬度可以指定域寬,%md-->m域寬,列印出來以後,在控制台上,顯示m位;
如果我們要列印的數的位數如果超過我們設定m則原樣輸出;
如果我們要列印的數的位數如果小於我們設定的位數,則補空白,具體如下:
如果m為正數,則左對齊(左側補空白);
如果m為負數,則右對齊(右側補空白)。
2.轉義字元問題
如果想輸出字元"%",則應該在「格式控制」字元串中用連續兩個%表示。
如:printf("%f%%", 1.0/3);輸出結果: 0.333333%。
參考資料:printf()-網路
scanf-網路
⑦ C語言強制類型轉換
強制類型轉換是把變數從一種類型轉換為另一種數據類型。
例如,如果想存儲一個long類型的值到一個簡單的整型中,需要把long類型強制轉換為int類型。可以使用強制類型轉換運算符來把值顯式地從一種類型轉換為另一種類型。
發生在同一個編譯系統中,比如說把int轉化為longint,在VC++6.0裡面,longint和int都是4個位元組,不會有問題的,但是如果把int類型轉化為short類型那就裝不下了,簡而言之就是長類型不能轉化為短類型。
int類型如果要轉化為float、double、longdouble類型的時候只是末尾多了幾個0,但是反之轉化,就會出現數據的損失,小數部位都被省略掉了。
賦值中的類型轉換
當賦值運算符兩邊的運算對象類型不同時,將要發生類型轉換, 轉換的規則是:把賦值運算符右側表達式的類型轉換為左側變數的類型。
由於C語言中的浮點值總是用雙精度表示的,所以float 型數據只是在尾部加0延長為double型數據參加運算,然後直接賦值。double型數據轉換為float型時,通過截尾數來實現,截斷前要進行四捨五入操作。
以上內容參考:網路-C語言類型強制轉換
⑧ c語言類型轉換
不要猜測,應該找一些資料看看。
在32位PC系統中,int型的3是0x00000003,在內存中佔4個位元組,分別是03,00,00,00
按照IEEE754浮點數表示標准,float型的3.0是0x40400000,在內存中佔4個位元組,分別是00,00,40,40
類似地,double型的3.0是0x0000000040080000,在內存中佔8個位元組,分別是00,00,08,40,00,00,00,00
如果用「%d」格式輸出,在指定地址處讀取2位元組,然後按十進制整數解釋輸出,float和double型的3的前兩個位元組都是「00,00」,解釋輸出當然就是0了。
類似地,如果用「%d」把浮點型的3.0按十進制整型格式解釋輸出,得到1074266112的結果也應該可以理解了,這正是0x40080000的十進制值。
在處理float類型時還有一種情況,隨編譯器的浮點運算優化而不同。有時編譯優化會對float型(不包括double類型)採用FPU中的浮點棧,按非「%f」的格式輸出時就會引起數據讀取的地址錯誤,因而得到一個隨機的值,並引起後續輸出錯位。
有些結果一下想不清楚,在初學階段只要知道是錯誤的就夠了。