簡體   English   中英

從“size_t”到“const double”的轉換,可能會丟失數據

[英]conversion from 'size_t' to 'const double', possible loss of data

給定一個變量size_t idx ,一個像double value = idx;這樣的賦值double value = idx; 在 64 位下編譯時產生以下警告:

'initializing': conversion from 'size_t' to 'double', possible loss of data

這似乎與在 64 位下編譯時size_t值占用 8 個字節有關。 但是,賦值double value = static_cast<double>(idx)不會產生任何警告。 有人可以向我解釋為什么前一個任務不起作用而后者起作用嗎?

提前致謝!

當你做

double value = idx;

編譯器查看它並說:“嘿, idx可能無法放入value ,讓我們告訴程序員,以防它出錯。”。 這就是您收到警告的原因。

當你做

double value = static_cast<double>(idx)

編譯器看着它,然后說:“哦,程序員在這里明確地進行了轉換,這一定是他們想要的。”。 這意味着它不會出現警告。

static_cast<double>是您告訴編譯器您有意識地轉換為double並了解所有含義的方式。 這意味着編譯器不應該警告您風險,因為您已經明確告訴它您已經意識到它們。

在第一種情況下,您不使用static_cast ,轉換是合法的,但有失去精度的風險。 由於您可能沒有注意到這種轉換正在發生,因此向您發出警告是有意義的。

這兩項任務都將“有效”,而且實際上,做的事情完全一樣! 唯一的區別是,在第二種情況下, double value = static_cast<double>(idx) ,您的顯式轉換向編譯器表明您“知道自己在做什么”並且您可能會在轉換中丟失有效數字.

在第一種情況下,編譯器只是警告您您的轉換可能(無意中)導致數據丟失(或精度,在這種情況下)。

這是一個警告,因為程序員可能沒有意識到他們在賦值期間丟失了位。

但是如果你在那里有一個顯式的演員,編譯器假設程序員知道他們在做什么,因為演員就在那里並且非常在你面前。

64 位 double 僅使用 52 位來存儲數字,其余部分用於存儲符號( +- )和指數。 注意:這是IEEE754的實現, double的實現可能在其他語言標准中有所不同)

unsigned int (又名size_t )使用所有 64 位來存儲數字,但沒有為指數留下空格,因此像size_t這樣的整數沒有浮點精度

因此,編譯器會告訴您,如果您的 64 位無符號整數大於 64 位double類型的尾數可以存儲的數量(即大於52 位),則可能會導致數據丟失,並且可能導致之后其余代碼中的未定義行為。

執行static_cast<double>(idx)是程序員的斷言,告訴編譯器不要擔心,並且您將牢記上述預防措施。

來源: https : //en.wikipedia.org/wiki/Double-precision_floating-point_format

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM