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

c語言double類型的轉換說明是什麼

發布時間: 2023-03-15 14:33:49

『壹』 c語言中double類型怎麼使用

使用printf時,它們具有相同的格式說明符,但使用scanf時,它們沒有相同的格式說明符。

為什麼是這樣?因為printf的參數被提升,而scanf的參數(作為指針)卻不被提升。

這種論點提升到底是什麼?當較小尺寸的參數(特別是char,short和float)傳遞給可變參數函數(如printf之類的函數,其參數數量不固定)時,它們將轉換為較大尺寸。Char和short轉換為int,float轉換為double。

為什麼這樣 據我所知,純粹出於歷史原因。C的設計師認為這是個好主意,因為這些轉換基本上是免費的,因為所有類型的尺寸都足夠小,可以放入單個寄存器或堆棧中的單個「單元」(將內容壓入堆棧必須與某些位元組邊界對齊,例如,堆棧上的每個項目都必須以4的倍數的地址開頭。同樣,顯然,這種轉換減少了傳遞參數時的錯誤。

因此,當您向printf傳遞float類型的參數時,實際上它會在轉換為printf之前就轉換為double類型。我們可以使用調試器證明這一點。我寫了下面的C代碼:

主要功能編譯成:

領取關於C/C++更多學習資料:

我在調用printf之前(在地址0x63b處)放了一個斷點。根據Linux x86_64調用約定,浮點參數在XMM寄存器中傳遞(CPU中特殊的小內存位置,可用於對多條數據並行執行同一條指令,但實際上可用於大多數事情) 。因此,我查看了第一個XMM寄存器xmm0,然後:

xmm0中的值之一,當解釋為雙精度值時,是1,恰好是我們傳遞給printf的值。同時,當將該寄存器中的值解釋為浮點數時,它們是這樣(巧合的是,我們得到1.875)。因此,轉換確實發生了。這就解釋了為什麼對於printf,我們在浮點數和雙精度參數中都使用%f -浮點數無論如何都會轉換為雙精度,因此printf不能分辨出兩者之間的區別。

同時,scanf的參數是指針,因此不受此轉換的限制。其原因是因為所有指針類型僅包含內存地址,並且所有內存地址都具有相同的大小(在我的64位計算機上為64位)。因此,當scanf在其格式字元串中獲得%f時,它將期望一個float *類型的指針,而當它獲得%lf時,將期望得到double *類型的指針。如果格式說明符和指針的類型不匹配,則會產生一些有趣的結果。

由於float的大小為4個位元組,而double的大小為8個位元組(至少在我的機器上),因此當我們寫入float *類型的指針所指向的位置時,我們將覆蓋4個位元組的內存。同時,如果我們寫入由雙*指向的位置,則將覆蓋8個位元組的內存。考慮以下代碼:

printf說明符上的.15標志只是使printf精確度更高。由於我們使用的是雙精度值(並且正如我剛剛說的那樣,%f也適用於printf的雙精度值),因此我們實際上可以訪問具有這種精度的數字(只要它們不是太大而不能填充即可。我實際上不是對浮點表示非常了解)

編譯並運行後,結果如下:

如您所見,如果我們忽略所有類型的fuckery,則數字應該匹配,但它們甚至不相近。這是為什麼?

好吧,我們給scanf%f說明符,所以它期望一個浮點數*。但是我們傳遞了一個雙*。現在,這些指針的實際值都只是地址-scanf不知道它們之間的區別。它進行了下去,讀取我們輸入的值,並將其存儲為float 。但是浮點數僅佔用4個位元組,因此scanf只會在我們可用的double變數的8個位元組中寫入4個位元組。在我的情況下,由於我的機器是低位位元組序的,因此似乎對應於double變數的細粒度(小有效位)數字的第4個位元組將被覆蓋。因此,當我們列印出double double back時,我們得到的數字幾乎與以前相同,但最低有效數字有所變化。

有想學習更多C/C++知識的,可以點擊下方了解更多,領取免費學習資料:

『貳』 c語言double什麼意思

double在這里是指將變數i和變數s定義為雙精度實型變數。(也就是說:賦給這兩個變數的值將以雙精度實型格式存儲在內存中)

注意事項

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

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


(2)c語言double類型的轉換說明是什麼擴展閱讀

賦值中的類型轉換

當賦值運算符兩邊的運算對象類型不同時,將要發生類型轉換, 轉換的規則是:把賦值運算符右側表達式的類型轉換為左側變數的類型。具體的轉換如下:

1、浮點型與整型

將浮點數(單雙精度)轉換為整數時,將舍棄浮點數的小數部分, 只保留整數部分。將整型值賦給浮點型變數,數值不變,只將形式改為浮點形式, 即小數點後帶若干個0。注意:賦值時的類型轉換實際上是強制的。

2、單、雙精度浮點型

由於C語言中的浮點值總是用雙精度表示的,所以float 型數據只是在尾部加0延長為double型數據參加運算,然後直接賦值。double型數據轉換為float型時,通過截尾數來實現,截斷前要進行四捨五入操作。

3、char型與int型

int型數值賦給char型變數時,只保留其最低8位,高位部分舍棄。

char型數值賦給int型變數時, 一些編譯程序不管其值大小都作正數處理,而另一些編譯程序在轉換時,若char型數據值大於127,就作為負數處理。

對於使用者來講,如果原來char型數據取正值,轉換後仍為正值;如果原來char型值可正可負,則轉換後也仍然保持原值, 只是數據的內部表示形式有所不同。

『叄』 c語言中的(double)數據轉換的問題

不用加!賦值表達式中系統自動轉換為賦值號「=」左邊脊纖的類型,即double類型,因為double類型的精度是最高的,所以系統沒有警告。

但是,假如,int a=10;double b=10.0;
a=b;就會警告,因為int類型的精者空度沒有double類型的高,會有精度損失!

不過,加了之後更規櫻嫌仿范一些,不要讓系統自動去轉化,人為的進行轉換更規范一些。

double數據的輸出時盡量用%lf。

『肆』 在C語言中Int和double怎麼轉換

1、打開vc軟體,新建一個空白的vc項目文件:

『伍』 C語言double的用法

double是一種數據類型 具有比float更高的精度 在32位機中以8個位元組儲存。
用法:同int float 一樣,用於聲明變數或定義函數的返回值類型,或可用於類型強制轉換。
例: double a;//變數聲明
double sqrt_(double b);//定義函數返回至類型及形參類型
c=(double)3;//將「3」強制轉換為double類型並賦給變數c

『陸』 c++中的%if,有什麼用,double是什麼函數,有什麼用

#include<stdio.h>
#include<math.h>

int main(void)
{
double x,s;
printf("input number:\n");
scanf("%lf", &x);
s = sin(x * 3.14 / 180);
/*
C語言math.h庫中的sin, cos, tan的參數是
弧度制, 不是角度制. 這點要明確...
%lf是轉換說明符, 這個說明符代表一個double類型的值
而對應的%f是float類型.
double 是一個數據類型說明符(也可以說是C語言的關鍵字)
double代表雙精度浮點類型的集合的名稱
而float代表單精度浮點類型的伏態集合的名稱
雙和單的區別就是精度的區別,
比如消廳啟雙精度可以精確到10的-8次方的數量級, 而單精度是10的-4次方
函數printf還有很多修飾符, 比如%.4lf代表精確到小數點後4位
而%4d代表數據寬度的最小值, 如果不能容納則系統會使用更長的寬度

注意: float和double很相似
但有一個區別需要注說明
float a;
double b;
scanf("%f", a); // 這個沒有錯
scanf("%f", b); // 這個就錯了
但是printf("%f %f\n", a, b);
是沒有錯的, 輸出時%f都可以作拿如用於double和float
但是輸入時要嚴格對照轉換說明符, 所以正確的寫法是:
scanf("%Lf", b); // lf和Lf和Lf是一樣的, 但f不能大寫
*/
printf("sine of %.2lf is %.2Lf\n", x, s);
getchar();
return 0;
}

輸出測試 (粗體代表輸入)
input number:
30
sine of 30.00 is 0.50

『柒』 double類型變數C語言里輸出時的格式說明符是什麼

double類型變數C語言里輸出時的格式說明符是%f。

float和double類型的輸出時的格式說明符都是%f,這是由於向那些未在原型中申明參數類型的函數傳遞參數時,float型會自動轉為double型頃腔唯,所以用%lf和%f結果都一樣。

例如:

doublea=3.1323;

floatb=0.234;

printf("%lf ",a);//輸出結果為3.1323

printf("%f ",b);//輸出結果為0.234

(7)c語言double類型的轉換說明是什麼擴展閱讀

1、雙精度浮點型,此數據類型與單精度數據類型(float)相似,但精確度比float高,編譯時所佔的內存空間依不同的編雀培譯器而有所不同,是double float數據類型,C/C++中表示實型變數的一種變數類型。

2、此數據類型與單精度數據類型(float)相似,但精確度比float高,編譯時所佔的內存空間依不同的編譯器而有所不同,通常情況,圓吵單精度浮點數佔4位元組(32位)內存空間,其數值范圍為-3.4E38~3.4E+38,;雙精度型佔8 個位元組(64位)內存空間,其數值范圍為-1.7E308~+1.7E308。

資料來源:網路:雙精度浮點型

『捌』 c語言中double是什麼意思

double(雙精度茄蔽浮點型)是計算機使用的一種資料型別。比起單精度浮點數(float),double(雙精度浮點數)使用 64 位(8位元組) 來儲存一個浮點數。 它可以表示十進制的15或16位有效數字,負值取值范圍為 -1.7976E+308 到 -4.94065645841246544E-324,正值取值范圍為 4.94065645841246544E-324 到 1.797693E+308

用法:同int float 一樣,用於聲明變數或定義函數的返回值類型,或可用於類型強制轉換。

例:

double顫早州a;//變數聲明
doublesqrt_(doubleb);//定義函數返回至類型及形參類型
c=(double)3;//將「3」強制轉換為double類型並賦給變數c

最後想要睜辯C/C++學習視頻、資料,可以關注「C語言Plus」。

『玖』 C語言中double有什麼用處

c語言中double的用法如下:double、float都是浮點型。double(雙精度型)比float(單精度型)存的數據更准確些,占的空間也更大。double精度是float的兩倍,所以需要更精確的計算常使用double。單精度浮點數在機內佔4個位元組,用32位二進制描述。雙精度浮點數在機內佔8個位元組,用64位二進制描述。浮點數在機內用指數型式表示,分解為:數符,尾數,指數符,指數四部分。數符佔1位二進制,表示數的正負。指數符佔1位二進制,表示指數的正負。尾數表示浮點數有效數字,0.xxxxxxx,但不存開頭的0和點指數存指數的有效數字。指數佔多少位,尾數佔多少位,由計算機系統決定。可能是數符加尾數佔24位,指數符加指數佔8位 -- float.數符加尾數佔48位,指數符加指數佔16位 -- double.知道了這四部分的佔位,按二進制估計大小范圍,再換算為十進制,就是你想知道的數值范圍。對編程人員來說,double 和 float 的區別是double精度高,有效數字16位,float精度7位。但double消耗內存是float的兩倍,double的運算速度比float慢得多,C語言中數學函數名稱double 和 float不同,不要寫錯,能用單精度時不要用雙精度(以省內存,加快運算速度)。

『拾』 C語言中double表示什麼

#include<stdio.h>

int main()

{

double a,b;

scanf("%lf%lf",&a,&b);

a+=b;

printf("%.4f ",a);

return 0;

}